策略模式:分别封装行为接口,实现算法族,超类里放行为接口,子类里放具体的行为对象。原则就是分离变化的部分,封装接口,基于接口编程
优点:算法可以自由切换,避免多重条件判断,扩展性良好
一.实例--鸭子
1.阶段一(继承)
(1)设计鸭子父类实现各种行为,然后不同的鸭子去继承它,只要实现各自的display()就可以了,但有新功能,比如飞要添加进来,只需在父类中添加飞的功能,子类就可实现飞了,但是并不是所有的鸭子都会飞,比如橡皮鸭
(2)出现的问题:对类的局部改动,尤其是超类的局部改动,会影响其它部分,影响会有溢出效应
2.阶段二(覆盖)
(1)既然橡皮鸭不能飞,那就在子类中覆盖掉
(2)产生的问题:超类中挖的坑,却要子类中也改动代码,增加了工作量,不是好的设计
3.阶段三(策略模式)
(1)分别封装行为接口,实现算法族,超类里放行为接口,子类里放具体的行为对象。原则就是分离变化的部分,封装接口,基于接口编程
二.代码实现
(1)鸭子类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void fly(){
flyBehavior.fly();
}
public void quack(){
quackBehavior.quack();
}
public abstract void display();
//加入get set方法能实现在运行的过程中动态的改变行为
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
(2)绿头鸭类
public class GreenHeadDuck extends Duck {
//在初始化构造函数的时候就设置鸭子的行为
public GreenHeadDuck(){
flyBehavior = new GoodFlyBehavior();
quackBehavior = new GaGaQuackBehavior();
}
public void display(){
System.out.println("green head...");
}
}
(3)飞行接口
//把行为进行抽象
public interface FlyBehavior {
public void fly();
}
(4)飞行实现
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("good fly...");
}
}