策略模式
需求
鸭子项目
- 有各种鸭子,比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等
- 显示鸭子的信息
基本介绍
- 策略模式中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
- 这算法体现了几个设计原则:
- 把变化的代码从不变的代码中分离出来
- 针对接口编程而不是具体类(定义了策略接口)
- 多用组合/聚合,少用继承(客户通过组合方式使用策略)
代码
策略接口
//飞行
public interface FlyBehavior{
//子类实现
void fly();
}
策略实现
//擅长飞行
public class GoodFlyBehavior implements FlyBehavior{
@Override
public void fly(){
System.out.println("飞行技术高超");
}
}
//飞行一般
public class BadFlyBehavior implements FlyBehavior{
@Override
public void fly(){
System.out.println("飞行技术一般");
}
}
//不能飞行
public class NoFlyBehavior implements FlyBehavior{
@Override
public void fly(){
System.out.println("不能飞行");
}
}
鸭子抽象
public abstract class Duck{
//飞行策略
private FlyBehavior flyBehavior;
//可以有其它策略
public Duck(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
//飞行
public void fly(){
flyBehavior.fly();
}
}
鸭子实现
//野鸭
public class WildDuck extends Duck{
//初始化
public WildDuck(){
super(new GoodFlyBehavior());
}
}
//北京鸭
public class PekingDuck extends Duck{
//初始化
public PekingDuck(){
super(new NoFlyBehavior());
}
}
//玩家鸭
public class ToyDuck extends Duck{
//初始化
public ToyDuck(){
super(new NoFlyBehavior());
}
}
使用
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
总结
- 策略模式的关键是:分析项目中变化部分和不变部分
- 策略模式的核心思想是:多用组合/聚合,少用继承;用行为类组合,而不是行为继承。更有弹性
- 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可
- 提供了可以替换继承关系的办法:策略模式将算法封装在独立的策略类中使得你可以独立的改变它,使它易于切换、便于理解、易于扩展
- 需要注意的是:每添加一个策略就要增加一个类,当策略过多会导致类数目庞大