设计模式之策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户,使算法可以在不影响到客户端的情况下发生变化。

详细介绍

角色划分:

  1. Strategy(策略接口):定义了所有支持的算法的公共接口。策略接口使得算法可以相互替换。
  2. ConcreteStrategy(具体策略类):实现了策略接口,提供了具体的算法实现。
  3. Context(环境类/上下文):持有一个策略类的引用,维护一个对策略对象的引用,并在适当的时候调用其算法方法。

工作流程:

  1. 客户端根据需要选择一个具体策略,并将它传给上下文。
  2. 上下文使用客户端传递的具体策略执行相关的算法。
  3. 客户端可以根据需要随时更换上下文中使用的策略,从而改变算法的行为。

使用场景

  • 当有多种算法完成同一任务,且算法之间可以根据一定条件互换时。
  • 需要动态选择算法,且算法的选择不会影响到客户端代码的结构时。
  • 避免使用多重条件转移语句(如if...else或switch...case)来选择算法。

注意事项

  • 策略类应当尽可能保持纯净,避免包含与算法无关的业务逻辑。
  • 上下文类不应包含太多有关策略的逻辑,它主要起到协调作用。
  • 考虑策略类的创建和管理,避免在系统中产生过多的策略实例。

优缺点

优点:

  • 高度灵活性:容易添加、移除和替换算法,无需修改使用算法的客户端代码。
  • 代码复用:相同的策略可以被多个上下文重用。
  • 清晰的职责划分:每个策略类只负责一个算法,易于理解和维护。

缺点:

  • 增加系统复杂度:引入了许多策略类和上下文类,可能使系统结构变得更加复杂。
  • 性能开销:频繁切换策略可能会有轻微的性能损失,尤其是在策略对象创建成本较高时。

Java代码示例

java 复制代码
// 策略接口
interface Strategy {
    int doOperation(int num1, int num2);
}

// 具体策略类:加法策略
class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

// 具体策略类:减法策略
class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());    
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());   
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    }
}

使用过程中可能遇到的问题及解决方案

问题1:策略类数量膨胀。

  • 解决方案:利用工厂模式或反射机制动态创建策略实例,减少硬编码的依赖。

问题2:策略选择逻辑复杂。

  • 解决方案:可以引入策略选择器(Strategy Selector)类,封装策略选择逻辑。

与其他模式对比

  • 与状态模式对比:两者都涉及行为的改变,但策略模式改变行为是基于外部请求,而状态模式是基于对象内部状态的改变。
  • 与模板方法模式对比:模板方法定义了一个算法的骨架,而将某些步骤延迟到子类中实现,而策略模式完全将算法的实现延迟到具体策略类中。

策略模式通过将算法或策略的实现与使用算法的代码分离,提供了极大的灵活性和可扩展性,是处理算法变化的经典解决方案。

相关推荐
vker1 小时前
第 1 天:单例模式(Singleton Pattern)—— 创建型模式
java·设计模式
晨米酱19 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript