策略模式

Author Avatar
丁起男 07月 02,2021
  • 在其它设备中阅读本文章

策略模式

需求

鸭子项目

  • 有各种鸭子,比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等
  • 显示鸭子的信息

基本介绍

  • 策略模式中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
  • 这算法体现了几个设计原则:
    • 把变化的代码从不变的代码中分离出来
    • 针对接口编程而不是具体类(定义了策略接口)
    • 多用组合/聚合,少用继承(客户通过组合方式使用策略)

代码

策略接口

//飞行
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();

总结

  • 策略模式的关键是:分析项目中变化部分和不变部分
  • 策略模式的核心思想是:多用组合/聚合,少用继承;用行为类组合,而不是行为继承。更有弹性
  • 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可
  • 提供了可以替换继承关系的办法:策略模式将算法封装在独立的策略类中使得你可以独立的改变它,使它易于切换、便于理解、易于扩展
  • 需要注意的是:每添加一个策略就要增加一个类,当策略过多会导致类数目庞大