一、什么是策略模式
书中对策略模式的定义如下:
定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
这里很清晰的介绍了策略模式的优点,下面是我的解读:
- 算法族:创建行为接口,以及一系列该接口的实现类
- 客户:拥有该行为的类,即组合该行为接口
- 互相替换:接口的实现类可互相替换,体现了多态性
使用了合成/聚合复用、针对接口编程、里氏代换原则
二、策略模式的使用
业务场景如下
首先,这是一个模拟鸭子的游戏,游戏中会出现各种鸭子,不同的鸭子有不同的行为,在这里方便起见只设定1个飞行的行为
算法族:
public interface FlyBehavior {
void fly();
}
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("can't fly!!!!oh my god");
}
}
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I'm flying,go away!!!!");
}
}
鸭子族:
public abstract class Duck {
FlyBehavior flyBehavior;
public abstract void display();
public void performFly(){
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
}
public class UglyDuck extends Duck {
public UglyDuck(){
flyBehavior = new FlyWithWings();
this.display();
}
@Override
public void display() {
System.out.println("I'm a ugly duck");
}
}
public class ModelDuck extends Duck {
public ModelDuck(){
flyBehavior = new FlyNoWay();
this.display();
}
@Override
public void display() {
System.out.println("I'm a model duck");
}
}
测试类:
public class StrategyTest {
public static void main(String[] args){
Duck duck = new UglyDuck();
duck.performFly();
//运行时改变行为
duck.setFlyBehavior(new FlyNoWay());
duck.performFly();
}
}
运行结果如下:
I'm a ugly duck
I'm flying,go away!!!!
can't fly!!!!oh my god
Process finished with exit code 0
三、总结
使用策略模式的主要步骤:
- 创建一个超类,定义算法族
- 父类组合算法接口
- 父类提供可以改变行为的方法
策略模式的应用场景: 主要根据不同的场景选择相应的行为类。例如在前后端交互中,根据前端传递的状态码,选择对应的算法类,这个场景需要事先定义好接口文档。(欢迎大家进行补充哦!)