设计模式之策略模式

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

与其他模式对比

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

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

相关推荐
Zane19941 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..1 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1502 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)2 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki3 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅663 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa3 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
sarasuki3 天前
如何让 Agent 获取更多的能力?插件 / 技能系统
人工智能·设计模式·agent
sarasuki3 天前
如何让 Agent 安全运行你的命令 :命令分级 + Hook + 读写锁
人工智能·设计模式·agent
Zane19943 天前
技术不难,为什么项目却越改越不敢动?聊聊复杂系统开发该怎么想
设计模式