Java 与设计模式:策略模式

举报
William 发表于 2024/11/29 09:32:30 2024/11/29
【摘要】 Java 与设计模式:策略模式 介绍策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换,从而让算法独立于使用它的客户端而变化。 应用使用场景策略模式适用于以下场景:当你需要在运行时根据不同的条件选择不同的算法或行为时。当有许多类仅在行为上稍有不同的情况,通过使用策略模式可以避免过多的子类化。当一个类需要动态地改变其...

Java 与设计模式:策略模式

介绍

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

应用使用场景

策略模式适用于以下场景:

  • 当你需要在运行时根据不同的条件选择不同的算法或行为时。
  • 当有许多类仅在行为上稍有不同的情况,通过使用策略模式可以避免过多的子类化。
  • 当一个类需要动态地改变其行为时。

原理解释

策略模式包含三部分:

  1. 策略接口(Strategy):定义了算法族的公共接口,具体算法实现类需实现这个接口。
  2. 具体策略(ConcreteStrategy):实现了策略接口中的具体算法。
  3. 上下文(Context):持有一个策略接口的引用,并且可以将具体策略设置给这个引用。

通过这样分离,用户可以根据需要动态地切换具体策略,而无需修改客户端代码。

算法原理流程图

+--------------+
|   Context    |
|              |
| + strategy   |<-------------------+
|              |                    |
+--+--------+--+                    |
   |        |                       |
   |        |                       |
+--v--------v--+              +-----v-------+
|   Strategy   |              |   Concrete  |
|   Interface  |              |   Strategy  |
|              |              |     A       |
+--^--------^--+              +-------------+
   |        |                       |
   |        |                       |
+--v--------v--+              +-----v-------+
|   Concrete   |              |   Concrete  |
|   Strategy   |              |   Strategy  |
|      B       |              |     C       |
+-------------+               +-------------+

算法原理解释

在策略模式中,Context持有一个Strategy接口的引用,可以在运行时通过设定不同的ConcreteStrategy对象来改变其所采用的算法。各个ConcreteStrategy实现了不同的算法,通过这样的方式使算法实现与使用算法的代码分离,使得代码更加灵活和可维护。

实际详细应用代码示例实现

策略接口

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

具体策略实现

public class AdditionStrategy implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

public class SubtractionStrategy implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

public class MultiplicationStrategy implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

上下文

public class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

测试代码

public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context();

        context.setStrategy(new AdditionStrategy());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context.setStrategy(new SubtractionStrategy());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context.setStrategy(new MultiplicationStrategy());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

部署场景

策略模式广泛用于开发系统中需要灵活切换算法的地方,例如支付方式选择、数据压缩算法的选择、各种排序算法的选择等。

材料链接

总结

策略模式提供了一种在软件设计中处理算法家族的优雅方式,通过接口和具体实现的分离,实现了动态策略的配置和更好的扩展性。

未来展望

随着软件复杂性的增加和对灵活性的需求不断提升,策略模式的重要性将进一步显现。结合其他新兴技术,如面向对象的框架和语言特性(如Java 8的Lambda表达式),策略模式可以得到更为简洁和高效的实现。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。