策略模式——Strategy

article/2025/8/22 18:02:18

文章目录

        • 案例展示——Strategy怎么用?
        • 深入分析——Strategy是什么?
          • Strategy的定义
          • Strategy的优点
          • Strategy的缺点
          • 策略模式的扩展——策略枚举
        • 参考

案例展示——Strategy怎么用?

 了解一点历史的人都知道商鞅变法,正是由于商鞅变法,奠定了秦国强大的根基,使秦国从一个最弱小的战国迅速成为一个超强战国,奋六世之余烈,终于在秦始皇手上一统天下。可以说,没有商鞅变法,就没有强大的秦国,或许也可以断言,天下将不会由秦朝统一。那么商鞅变法为什么会有这么大的规律呢,现在我们从软件的设计的角度来看看商鞅变法的威力,下面是类图设计:

image

分析上面的类图:

  • IStrategy:抽象策略类,定义一个执行法律的方法

  • AwardBattle:法律一,鼓励打仗

  • AbolishSlave:法律二,废除奴隶制度

  • DefeatNobility:法律三,推翻贵族的垄断地位,取消封地

  • SYUpdateLaw:商鞅变法,执行法律

 看看上面的每一个法律,是不是都透露着变法家的博大情怀。每一个法律就是一个策略,每一次策略的实施都会使秦国发生脱胎换骨的变化。鼓励耕战,使国人争相入军报效国家,国家实力迅速提升;废除奴隶制度,使奴隶得到解放,人人拥护国家,为国效力;最重要的是推翻世族统治,封地收归国有,权利高度集中。正是由于秦国贯彻实施了商鞅变法,才造就了后来的辉煌蓝图。

下面是具体的代码实现:

// 抽象策略类
public interface IStrategy {// 每天政策都需要切实执行public void operate();
}// 法律一:鼓励耕战
public class AwardBattle implements IStrategy {public void operate() {System.out.println("奖励有功战士!");}
}// 法律二:废除奴隶制
public class AbolishSlave implements IStrategy {public void operate() {System.out.println("废除奴隶制度,举国之人皆是国民!");}
}// 法律三:推翻贵族统治
public class DefeatNobility implements IStrategy {public void operate() {System.out.println("推翻世族,人人平等!");}
}// 商鞅变法
public class SYUpdataLaw {// 构造函数中传入要实施的律法private IStrategy strategy;public SYUpdataLaw(IStrategy strategy) {this.strategy = strategy;}// 实施法律public void operate() {this.strategy.operate();}
}// 开始变法
public class Client {public static void main(String[] args) {// 准备好法律,依次颁布实施SYUpdataLaw ul;System.out.println("==========前三年:鼓励打仗========");ul = new SYUpdataLaw(new AwardBattle());// 执行法律ul.operate();System.out.println("==========中三年:废除奴隶制=======");ul = new SYUpdataLaw(new AbolishSlave());// 执行法律ul.operate();System.out.println("==========时机成熟:推翻世族=======");ul = new SYUpdataLaw(new DefeatNobility());// 执行法律ul.operate();}
}// 结果如下:
==========前三年:鼓励打仗========
奖励有功战士!
==========中三年:废除奴隶制=======
废除奴隶制度,举国之人皆是国民!
==========时机成熟:推翻世族=======
推翻世族,人人平等!

 上面的例子中就使用到了策略模式,每一个法律就是一个策略,策略用好了,国家就强大了。

深入分析——Strategy是什么?

Strategy的定义

定义: 定义一组算法,将每个算法都封装起来,并且使它们可以相互交换。通用类图设计如下:

image

  • Context组建:上下文角色,起承上启下的作用,屏蔽高层模块、算法的直接
    直接访问,封装可能存在的变化

  • Strategy组建:抽象策略角色,通常是接口,定义每个策略或算法所必须具有的方法和属性

  • ConcreateStrategy组建:具体的策略,实现了Strategy接口

下面是通用代码实现:

// 策略接口
public interface Strategy {// 执行策略public void doSomething();
}// 策略1
public class ConcreateStrategy1 implements Strategy {public void doSomething() {System.out.println("执行策略1");}
}// 策略2
public class ConcreateStrategy2 implements Strategy {public void doSomething() {System.out.println("执行策略2");}
}// 妙计锦囊
public class Context {// 抽象策略private Strategy strategy = null;// 在构造函数中设置具体策略public Context(Strategy strategy) {this.strategy = strategy;}// 执行策略方法public void doAnything() {this.strategy.doSomething();}
}// 实施策略
public class Client {public static void main(String[] args) {// 声明一个具体的策略Strategy strategy = new ConcreateStrategy1();// 造一个锦囊Context context = new Context(strategy);// 执行策略context.doAnything();}
}
Strategy的优点
  • 算法可以自由切换

  • 避免多重条件判断

  • 扩展性良好,新增一个算法只要实现接口就行了

Strategy的缺点
  • 策略类数量增多会增加系统的复杂性

  • 所有的策略类都需要向外暴露,不利于和高层模块的解耦

策略模式的扩展——策略枚举

直接看代码:

// 枚举的计算类
public enum Calculator {// 加法运算ADD("+") {public int exec(int a, int b) {return a + b;}},// 减法运算SUB("-") {public int exec(int a, int b) {return a - b;}};String value = "";// 定义成员值类型private Calculator(String value) {this.value = value;}// 获得枚举成员的值public String getValue() {return this.value;}// 声明一个抽象函数public abstract int exec(int a, int b);
}// 计算
public class Client {public static void main(String[] args) {// 两个参数int a = 10, b = 20;System.out.println("运算结果为:" + Calculator.ADD.exec(a, b));System.out.println("运算结果为:" + Calculator.SUB.exec(a, b));}
}

 程序是什么意思一眼就能看出来,现在来说说什么是枚举策略,下面简单定义一下:

  • 是一个枚举类
  • 浓缩了策略模式的枚举,换句话说,每一个枚举算法就是策略

参考

《设计模式之禅》


http://chatgpt.dhexx.cn/article/Mlqux3o8.shtml

相关文章

策略模式,Strategy

策略模式的定义是: 定义一组算法,封装每个算法,让它们可以互换。让客户端可以单独切换算法。 其UML类图的示例如下: 在这个模式中,参与者包括: Strategy:为所有支持的算法声明一个共同的接口。…

策略模式/Strategy

策略模式/Strategy 意图/适用场景: 策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以互换。这样做的好处是,客户端可以以插件的方式更换算法。 电子商务网站的购物车系统是一个策略模式非常适用…

Strategy - 策略模式

定义 定义一系列的算法,把它们一个一个的封装起来,并且使它们可以相互替换,策略模式使得算法可以独立于使用者而变化。 案例 比如现在有一个文件编辑器Editor,它在保存的时候,可以保存为任意的格式。所有文件内容转换均…

策略模式 strategy

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一 个抽象策略类的子类。用一句话来说,就是:“准备一组算法&#x…

策略模式Strategy

策略模式是行为模式的一种,和模板模式解决的问题一样,实现了通用逻辑和算法细节的解耦合,不同的是模板模式采用继承实现,基类中通用逻辑需要确定下来不可随意更改,策略模式采用组合实现,比较灵活&#xff0…

Strategy策略

针对问题 针对特定问题具有多种算法时,我们需要根据上下文随时切换策略,这时运用strategy模式就能良好地组织代码关系,实现灵活选择和切换。 例子 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式&#xff0c…

策略(Strategy)模式

9. 策略(Strategy) Intent 定义一系列算法,封装每个算法,并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 Class Diagram Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。Context 是使用到该算法族的类,其中的 doSomething() 方法会调用…

策略模式使用

策略模式 策略模式就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换;它可以替换继承关系,避免使用多重条件转移语句 典型应用场景 根据不同的类型选择不同的计费策略、处理机制 参考:https://blog.csdn.net/u010247622/…

Option Explicit的作用

在VBScript中经常可以看到代码的最上面会出现“Option Explicit”,那么它的作用到底是干什么的呢? VBScript中并不要求显示定义变量,即变量可以不经定义直接使用,这样很方便,但是也很容易出现问题; 比如先定…

策略模式(常用用法)

策略模式 在软件开发中常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。 策略(St…

策略模式之配置策略

了解策略模式建议大家先看一下这篇 https://www.runoob.com/design-pattern/strategy-pattern.html 步骤一创建一个接口 public interface Strategy {public int love(int a,int b); } 然后实现对应的接口A和B public class StrategyA implements Strategy {Overridepubli…

策略模式--strategy

策略模式 含义: 策略模式(Strategy)属于对象行为型设计模式, 1.主要是定义一系列的算法, 2.把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。 策略模式使这些算法在客户端调用它们的时候能够互…

策略模式(Strategy)

设计模式系列 Strategy 策略模式——对象行为模式 1.意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立使用它的客户而变化。 2.适用性 当存在以下情况时使用Strategy模式 许多相关的类仅仅是行为有异。“策…

CTA 策略分享之三 -- 策略优化

上一个帖子介绍了一个趋势跟踪策略的优化思路,今天我们继续对策略进行分析,找到另外的优化方法。先看回测的权益曲线: 看到在2017 8月份到2018 2月份策略出现了较大的回撤。先定性分析一下,应该是在这段时间内日线级别的图形上震…

证书扩展中的oid

4.1.2.9. 扩展 该字段必须仅在版本为 3 时出现(第 4.1.2.1 节)。 如果存在,该字段是一个或多个证书扩展的序列。 Internet PKI 中证书扩展的格式和内容在第 4.2 节中定义。 为 X.509 v3 证书定义的扩展提供了将附加属性与用户或公钥相关联以及…

OID科普:物联网OID与互联网域名的区别 | 圣笛数控

1.主导机构不同,物联网OID是以全球共同参与的国际标准组织统一分配。各国管理自己境内部分,各国之间又可以互通。安全机制比互联网域名更高,既有高度自治又有全球互通。中国是整个体系中最大的支持者和应用者。 2.表现形式不同,物…

OID技术与物联网、区块链、大数据的关系 | OID科普

一、什么是物联网? 物联网既是网络与物品与企业与人与万物互联,更是信息技术业务和应用。是利用局部网络或互联网等通信技术把传感器、控制器、机器、人员和物等通过新的方式联在一起,形成人与物、物与物相联,实现信息化、远程管…

ArcGIS中ObjectID,FID和OID字段区别

ArcGIS中ObjectID,FID和OID字段区别 当我们创建一个Shapefiles(shp), geodatabase feature classes(gdb中的要素类)或独立的dBase表(dbf)时,ArcGIS会自动为上述三种格式创建一个ID字…

圣笛数控|OID是什么?看OID在未来人类社会生活中的地位

OID定义,OID是什么? OID(Object Identifier 对象标识符),是由国际三大标准组织ISO、IEC、ITU向全球颁布并供各国共同遵守的物品身份标识标准体系,现已被208个国家和地区采用。OID作为全球新物联通识标准&a…

OID科普:OID为什么被称为元标识?

物联网的标识有很多种,包括应用标识、载体标识以及网络标识,我们常见的 IC 卡、二维码、RFID 及传感器都可归为载体标识。当需要用到不同体系下的标识符时,如何处理不同标识符之间的兼容性等问题呢?这个时候,三大国际组…