设计模式是开发过程中应对一般问题的解决方案,通常是长期编码经验和试错的总结。目前市面上相关书籍提到的公认设计模式大概有23种,在此介绍其中之一:策略模式。
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。很大程度上减少了代码耦合度。
该模式提到的原则有:1、找出应用中可能需要变化之处,把他们独立起来,不要和那些不需要变化的代码混在一起。2、针对接口编程,而不是针实现。3、多用组合、少用继承。
举例说明,摘自《Head First 设计模式》:
定义一个鸭子类:
public abstract class Duck {
//将飞行和叫的行为接口组合在此
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {}
public abstract void display();
//所有实现共有的方法
public void swim() {
System.out.println("All ducks float, even decoys!");
}
//不同种类有不同的飞行方法,但均可由 FlyBehavior表示
public void performFly() {
flyBehavior.fly();
}
//不同种类有不同的叫方法,但均可由 QuackBehavior表示
public void performQuack() {
quackBehavior.quack();
}
//提供方法动态改变行为
public void setFlyBehavior(FlyBehavior fb) {
this.flyBehavior = fb;
}
//提供方法动态改变行为
public void setQuackBehavior(QuackBehavior qb) {
this.quackBehavior = qb;
}
}
分别有一个飞行和叫的行为接口
public interface FlyBehavior {
void fly();
}
public interface QuackBehavior {
void quack();
}
让不同的行为实现这些接口
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!");
}
}
//以及FlyNoWay、FlyRocketPowered等行为,随意添加
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
以及MuteQuack、Squeak等行为,随意添加,此处略
创建所需要的鸭子对象继承鸭子类,但需要改变的行为只是继承了接口引用。
public class MallardDuck extends Duck {
//通过构造可以赋予指定行为
MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I’m a real Mallard duck!");
}
}
但在运行时也可以改变行为,测试类
public class MiniDuckSimulator{
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
//动态改变行为
mallard.setFlyBehavior(new FlyRocketPowered());
mallard.performFly();
}
}
|
|