设计模式之策略模式

策略模式(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)类,封装策略选择逻辑。

与其他模式对比

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

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

相关推荐
AustinXu1 小时前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏1 小时前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术1 小时前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术1 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan2 小时前
设计模式小记
设计模式
卡牌RWA研究院2 小时前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏1 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客1 天前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o1 天前
设计模式 18 · 状态模式
设计模式·状态模式
莫得感情 o1 天前
设计模式 17 · 责任链模式
设计模式·责任链模式