策略模式(Strategy)

这篇具有很好参考价值的文章主要介绍了策略模式(Strategy)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

策略模式是一种行为设计模式,就是定义一系列算法,然后将每一个算法封装起来,并使它们可相互替换。本模式通过定义一组可相互替换的算法,实现将算法独立于使用它的用户而变化。

Strategy is a behavioral design pattern that defines a series of algorithms, then encapsulates each algorithm and
makes them interchangeable. This pattern enables algorithms to vary independently of the users who use them by
defining a set of interchangeable algorithms.  

结构设计

为实现一系列可相互替换的算法,可定义一个公共接口,然后定义一组实现该接口的具体策略,这样就可在上下文中使用该接口调用具体策略上定义的算法。
Context,上下文,维护指向具体策略的引用,且仅通过策略接口与该对象进行交流。上下文,可以维护一个对策略对象的引用,这符合组合设计原则。
上下文,定义了一个接口以封装对策略对象的访问。如果策略对象直接暴露给外部使用,会导致其内部实现细节的暴露,从而增加接口使用难度。
Strategy,策略基类或策略接口,声明了一个上下文用于执行策略的方法。
ConcreteStrategy,具体策略类,实现了策略类声明的方法。
策略模式类图表示如下:
策略模式(Strategy),设计模式,策略模式,java

伪代码实现

接下来将使用代码介绍下策略模式的实现。

// 1、抽象策略类,声明执行策略的方法
public interface IStrategy {
    void operation(String paramStr);
}
// 2、具体策略类A,实现策略接口声明的方法
public class ConcreteAStrategy implements IStrategy {
    @Override
    public void operation(String paramStr) {
        System.out.println("do some thing in the concrete A instance");
    }
}
// 2、具体策略类B,实现策略接口声明的方法
public class ConcreteBStrategy implements IStrategy {
    @Override
    public void operation(String paramStr) {
        System.out.println("do some thing in the concrete B instance");
    }
}
// 3、策略上下文,维护指向具体策略的引用,且仅通过策略接口与该对象进行交流。这里提供两种使用策略类的方式。
public class StrategyContext {
    private static final Map<String, IStrategy> STRATEGY_MAP;
    
    private IStrategy strategy;
    
    static {
        STRATEGY_MAP = new HashMap<>();
        STRATEGY_MAP.put("type A", new ConcreteAStrategy());
        STRATEGY_MAP.put("type B", new ConcreteBStrategy());
    }
    
    public StrategyContext() {
    }
    
    public StrategyContext(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void doSomething(String paramStr) {
        strategy.operation(paramStr);
    }

    public void doSomething(String strategyType, String paramStr) {
        IStrategy currentStrategy = STRATEGY_MAP.get(strategyType);
        if (Objects.isNull(currentStrategy)) {
            throw new RuntimeException("strategy is null");
        }
        currentStrategy.operation(paramStr);
    }
}
// 4、策略模式客户端
public class StrategyClient {
    public void test() {
        StrategyContext strategyContextA = new StrategyContext(new ConcreteAStrategy());
        strategyContextA.doSomething("TEST");
        StrategyContext strategyContextB = new StrategyContext();
        strategyContextB.doSomething("type B", "TEST");
    }
}

适用场景

在以下情况下可以考虑使用策略模式:
(1) 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
(2) 一个系统需要动态地在几种算法中选择一种, 可考虑使用策略模式。
策略模式能够将对象关联至可以不同方式执行特定子任务的不同子对象,从而以间接方式在运行时更改对象行为。
(3) 当类中使用了复杂条件运算符(如多重的条件选择语句)以在同一算法的不同变体中切换时, 可使用该模式。
策略模式可将所有继承自同样接口的算法抽取到独立类中,因此可以不需要条件语句。原始对象并不实现所有算法的变体,而是将执行工作委派给其中的一个独立算法对象。
(4) 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。
策略模式让你能将各种算法的代码、 内部数据和依赖关系与其他代码隔离开来。 不同客户端可通过一个简单接口执行算法, 并能在运行时进行切换。

优缺点

策略模式有以下优点:
(1) 符合开闭原则。可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
(2) 定义一系列可重用的算法。策略模式提供了管理相关的算法族的办法。
(3) 使用组合来代替继承。实现支持多种算法或行为的方法。
(4) 避免使用多重条件语句。当不同的行为堆砌在一个类时,很难避免使用条件语句来选择合适的行为。如果将行为封装在一个个独立的Strategy类中,则可消除这些条件语句。
如使用字典的初始化从文件中读取的方式,就可将策略配置移除到外部,从而进一步减少不必要的代码修改。
但是策略模式也存在以下缺点:
(1) 如果使用的算法极少发生改变,那么没有任何理由引入新的类和接口。使用策略模式只会让程序过于复杂。
(2) 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
(3) 许多现代编程语言支持函数类型功能,允许在一组匿名函数中实现不同版本的算法。这样,就可以使用这些函数来替换策略对象,无需借助额外的类和接口来保持代码简洁。如在Java语言中是Lambda表达式,在C++语言中是函数指针。

参考

《设计模式 可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著, 李英军, 马晓星等译
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html 策略模式
https://refactoringguru.cn/design-patterns/strategy 策略模式
https://www.runoob.com/design-pattern/strategy-pattern.html 策略模式
https://www.cnblogs.com/adamjwh/p/11011095.html 简说设计模式——策略模式
https://blog.csdn.net/ShuSheng0007/article/details/88085445 秒懂设计模式之策略模式文章来源地址https://www.toymoban.com/news/detail-625484.html

到了这里,关于策略模式(Strategy)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大话设计模式——18.策略模式(Strategy Pattern)

    简介 是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。 UML图 应用场景 Java AWT中的LayoutManager(布局管理器) 系统中存在多个类,它们的区别仅在于它们的行为 不希望暴露

    2024年04月13日
    浏览(47)
  • 【设计模式-02】Strategy策略模式及应用场景

    Java 官方文档 Overview (Java SE 18 JDK 18) module index https://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 JDK 18) declaration: module: java.base, package: java.util, interface: Comparator https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Compar

    2024年01月16日
    浏览(45)
  • C++设计模式_04_Strategy 策略模式

    接上篇,本篇将会介绍C++设计模式中的 Strategy 策略模式 ,和上篇 模板方法Template Method 一样,仍属于“组件协作”模式,它与Template Method有着异曲同工之妙。 在软件构建过程中,某些对象使用的算法可能多种多样ÿ

    2024年02月09日
    浏览(40)
  • 设计模式二十二:策略模式(Strategy Pattern)

    定义一系列算法,将每个算法封装成独立的对象,并使这些对象可互相替换。这使得在运行时可以动态地选择算法,而不必改变使用算法的客户端代码。策略模式的主要目标是将算法的定义与使用分离,使得客户端可以根据需要灵活地选择和切换不同的算法,而不影响到客户

    2024年02月11日
    浏览(39)
  • java设计模式---策略模式

    策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。 策略模式的类图: 在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。 首先,

    2024年02月10日
    浏览(45)
  • Java设计模式——策略模式

    1. 策略模式简介 策略模式: 策略模式是一种行为型模式, 它将对象和行为分开, 将行为定义为一个行为接口和具体行为的实现 策略模式最大的特点是行为的变化, 行为之间可以相互替换 每个if判断都可以理解为一个策略. 本模式是的算法可独立于使用它的用户而变化 2. 模式结构

    2024年02月11日
    浏览(53)
  • Java特性之设计模式【策略模式】

    概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法 主要解决 :在有多种

    2024年02月08日
    浏览(55)
  • Java设计模式之策略模式详解

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同踏入Java设计模式之策略模式的世界,探讨代码中的智慧抉择。 策略模式的核心思想 策略模式是一种行为型设计模式,它定义了算法家族

    2024年01月20日
    浏览(47)
  • Java设计模式——策略

    前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否存在合法的授权,如果授权不合法则要求用户

    2024年02月20日
    浏览(46)
  • Java设计模式-策略模式-基于Spring实现

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在 独立的策略类 中,使得它们可以相互替换,而不影响客户端代码。这种模式通过 将算法的选择从客户端代码中分离出来 ,提供了更大的灵活性和可维护性。 在Java中,策略模式的设计理念可以

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包