设计模式是什么鬼(策略)

设计模式是什么鬼(策略)
最新回答
浪漫尽失

2021-12-19 07:31:20

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端。

  • 核心思想:策略模式通过将算法或行为封装成独立的对象,使得它们可以在运行时动态地切换。这种模式强调“开闭原则”,即对扩展开放,对修改关闭。通过增加新的策略类来扩展功能,而不是修改现有的代码。

  • 组成部分

    策略接口(Strategy Interface):定义所有支持的算法的公共接口。例如,在计算器例子中,Strategy接口定义了calculate方法。

    具体策略类(Concrete Strategies):实现策略接口的具体算法类。例如,Addition和Subtraction类分别实现了加法和减法策略。

    上下文类(Context):持有一个策略对象的引用,并调用策略对象的方法。例如,Calculator类通过setStrategy方法设置当前使用的策略,并通过getResult方掘槐法调用策略的calculate方法。

  • 优势

    灵活性:可以在运行时切换不同的算法或行为,而无需修改上下文类的代码。

    可扩展性:新增算法时,只需添加新的策略类,而不需要修改现有代码,符合开闭原则。

    解耦:将算法与使用仔兄算法的代码分离,降低耦合度,提高代码的可维护性。

  • 应用场景

    当一个系统需要在多种算法中选择一种时,例如排序算法、压缩算法等。

    当一个类有多种行为,且这些行为在类的操作中以多个条件语句的形式出现时,可以使用策略模式将这判戚友些行为移到具体的策略类中。

    当需要动态切换算法或行为时,例如游戏中的角色行为、支付方式的选择等。

  • 实例分析

    计算器例子

    初始实现中,Calculator类直接包含加法和减法方法,违反了开闭原则,难以扩展新的算法。

    通过策略模式,将加法和减法算法封装为独立的策略类Addition和Subtraction,Calculator类通过持有策略对象的引用来调用算法,实现了算法的动态切换和扩展。

    游戏机例子

    早期的俄罗斯方块游戏机只能玩单一游戏,缺乏扩展性。

    任天堂的Game Boy和索尼的PSP通过提供统一的卡槽接口,支持更换游戏卡带,实现了多游戏共用同一主机,类似于策略模式中通过更换策略对象来改变行为。

  • 代码示例

    策略接口

    public interface Strategy { public int calculate(int a, int b);}

    具体策略类

    public class Addition implements Strategy { @Override public int calculate(int a, int b) { return a + b; }}public class Subtraction implements Strategy { @Override public int calculate(int a, int b) { return a - b; }}

    上下文类

    public class Calculator { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public int getResult(int a, int b) { return this.strategy.calculate(a, b); }}

    客户端使用

    public class Client { public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.setStrategy(new Addition()); int result = calculator.getResult(1, 1); System.out.println(result); // 输出2 calculator.setStrategy(new Subtraction()); result = calculator.getResult(1, 1); System.out.println(result); // 输出0 }}
  • 总结:策略模式通过将算法或行为封装成独立的对象,实现了算法的动态切换和扩展,提高了代码的灵活性和可维护性。它在需要多种算法或行为选择的场景中非常有用,例如游戏角色行为、支付方式选择、排序算法等。通过策略模式,可以避免在上下文类中使用大量的条件语句,使代码更加清晰和易于扩展。