设计模式之策略模式

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

与其他模式对比

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

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

相关推荐
GodKeyNet2 小时前
设计模式-责任链模式
java·设计模式·责任链模式
摘星编程6 小时前
深入理解责任链模式:从HTTP中间件到异常处理的实战应用
http·设计模式·中间件·责任链模式·实战应用
鼠鼠我呀28 小时前
【设计模式04】单例模式
单例模式·设计模式
缘来是庄17 小时前
设计模式之访问者模式
java·设计模式·访问者模式
hqxstudying19 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
花好月圆春祺夏安20 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
fie888921 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
哆啦A梦的口袋呀21 小时前
《深入设计模式》模式结构汇总
设计模式
花好月圆春祺夏安21 小时前
基于odoo17的设计模式详解---单例模式
单例模式·设计模式
在未来等你1 天前
设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
设计模式·模板方法模式·软件架构·java开发·面向对象设计·设计模式实战·java应用开发