策略模式(Strategy Pattern)

47 阅读2分钟

攻略大全

1. 粘贴攻略

2. 造火箭攻略

3. 拧螺丝攻略

/**
 * @author Huadao
 * @date Created in 2022/11/16
 * @desc 抽象策略角色:接口或抽象类,给出所有具体策略类所需实现的抽象逻辑
 */
public interface IStrategy {

    void doSomething();
}
/**
 * @author Huadao
 * @date Created in 2022/11/16
 * @desc 具体策略角色:实现具体的策略逻辑
 */
public class CatStrategyImpl implements IStrategy{

    @Override
    public void doSomething() {
        // 该策略下的具体逻辑
        System.out.println("sleep");
    }
}
/**
 * @author Huadao
 * @date Created in 2022/11/16
 * @desc 具体策略
 */
public class DogStrategyImpl implements IStrategy{

    @Override
    public void doSomething() {
        // 该策略下的具体逻辑
        System.out.println("play");
    }
}
/**
 * @author Huadao
 * @date Created in 2022/11/16
 * @desc 策略环境:持有抽象策略角色的引用
 *
 *      策略模式
 *      优点:
 *          策略类之间可以自由切换,由于策略类都实现同一个接口,所以使它们之间可以自由切换
 *          易于扩展,增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
 *          避免使用多重条件选择语句(if else),充分体现面向对象设计思想
 *      缺点:
 *          客户端必须知道所有的策略类,并自行决定使用哪一个策略类
 *          策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量
 *      应用场景:
 *          动态选择多种复杂行为时
 *
 */
public class StrategyContext {

    private IStrategy iStrategy;

    /**
     * 根据客户端传入的不同条件选择不同的策略逻辑
     * @param animal
     */
    public void doSomething(String animal) {
        switch (animal) {
            case "cat":
                iStrategy = new CatStrategyImpl();
                break;
            case "dog":
                iStrategy = new DogStrategyImpl();
                break;
            default:
                iStrategy = null;
                break;
        }
        if (iStrategy != null) {
            iStrategy.doSomething();
        }
    }

}

3.1 优点

  • 策略类之间可以自由切换
    由于策略类都实现同一个接口,所以使它们之间可以自由切换。

  • 易于扩展
    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

3.2 缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

3.3 应用场景

动态选择多种复杂行为

该行为可理解为:

  1. 复杂的算法 / 数据结构
  2. 类的行为 / 方法
    注:提高了行为的保密 & 阿暖

4. 复制攻略

4.1 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南