策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
现实例子,旅行出游的方式有很多种,地铁,骑车……每一种都是一个策略。
我们用鸭子的例子
1通过分离变化得出的策略接口
/*
* 策略接口,实现鸭子的飞行行为
*/
public interface FlyingStragety {
void performFly();
}
2.策略接口的实现
import com.imooc.pattern.strategy.FlyingStragety;
public class FlyNoWay implements FlyingStragety {
public void performFly() {
System.out.println("我不会飞行!");
}
}
3.在客户端中,有策略接口
/*
* 超类,所有的鸭子都要继承此类
* 抽象了鸭子的行为:显示和鸣叫
*/
public abstract class Duck {
/*
* 鸭子发出叫声
* 通用行为,由超类实现
*/
public void quack(){
System.out.println("嘎嘎嘎");
}
/*
* 显示鸭子的外观
* 鸭子的外观各不相同,声明为abstract, 由子类实现
*/
public abstract void display();
//这里就是策略接口
private FlyingStragety flyingStragety;
public void setFlyingStragety(FlyingStragety flyingStragety) {
this.flyingStragety = flyingStragety;
}
public void fly(){
flyingStragety.performFly();
}
}
4.在客户端中选择正确的策略
import com.imooc.pattern.strategy.impl.FlyNoWay;
public class RubberDuck extends Duck {
public RubberDuck() {
super();
super.setFlyingStragety(new FlyNoWay());//选择这个
}
@Override
public void display() {
System.out.println("我全身发黄,嘴巴很红");
}
public void quack(){
System.out.println("嘎~嘎~嘎~");
}
}
总结
在长期的开发当中如何稳定框架的不变,这就需要找到应用中需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起
有人会觉得,这个很麻烦啊,我直接继承不行吗?如果继承,那可能每次都要修改方法,如果是接口,那就更要去实现他了。