策略模式/Strategy

article/2025/8/22 19:11:08

策略模式/Strategy

意图/适用场景:

策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以互换。这样做的好处是,客户端可以以插件的方式更换算法。

电子商务网站的购物车系统是一个策略模式非常适用的场景:比如,在优惠方式上,某一类商品是每件优惠一元,另一类商品是折扣5%,还有一类商品也是打折,但折扣幅度是10%。所以需要应用不同的优惠算法来计算最终的价格。

在这个系统中,可以想象到会有一个计算者角色(与本模式中的Context相同功能),它负责计算价格。但如果把所有的算法都放在它里面来实现的话,会比较混乱。如果应用策略模式的话,就可以把行为和上下文环境分开。上下文类(计算者)中负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响到上下文和客户端。这也为上下文类减轻了负担。

UML:

策略模式/Strategy

参与者:

  1. 上下文角色(Context):持有一个Strategy类的引用。
  2. 抽象策略角色(Strategy):抽象角色,通常是一个接口或者抽象类。定义出所有的具体策略类的公共接口。如果具体策略类有共同的行为,可以把Strategy定义为抽象类,并实现这些公共的行为;否则最好定义为接口。
  3. 具体策略(ConcreteStrategy):包装了相关的算法或行为。

要点:

在下面的情况下应当考虑使用策略模式:

  1. 系统需要动态地在多种算法中选择一种;
  2. 算法很多,如果由一个角色来处理的话,逻辑会非常混乱;
  3. 算法不可让客户端知道。

策略模式的最大优点在于把算法分门别类,由不同的实体类来维护,实现了算法本身与算法的使用者之间的弱耦合。而且把一个搅在一起的大算法分而治之,避免了大量使用条件而造成的混乱。

应用实例:

排序策略系统,参见《Java与模式》本章。

策略模式/Strategy

相关模式:

以下模式在结构上与策略模式相似,它们的区别多半在于用意不同,适用的场景是不同的。

  1. 策略模式:强调的是算法的分治与选择。
  2. 建造模式:它的核心功能是以一步一步的方式创建一个产品,把各个零件分别制造并组装起来,最后形成一个产品。
  3. 适配模式:它的用意在于把不同接口的对象“转接”成客户端所需要的接口。
  4. 装饰模式:它的用意在于在不改变接口的情况下,增强一个对象的功能。

示例代码:

[java]
// Source code from file:  ConcreteStrategyA.java

package designPatterns.Strategy;

public class ConcreteStrategyA implements Strategy {
public void strategy() {
System.out.println("ConcreteStrategyA.strategy()");
}
}

// Source code from file:  ConcreteStrategyB.java

package designPatterns.Strategy;

public class ConcreteStrategyB implements Strategy {
public void strategy() {
System.out.println("ConcreteStrategyA.strategy()");
}
}

// Source code from file:  Context.java

package designPatterns.Strategy;

public class Context {
private Strategy strategy;

public void strategy(char type) {
if ('A' == type)
strategy = new ConcreteStrategyA();
else if ('B' == type)
strategy = new ConcreteStrategyB();
strategy.strategy();
}
}

// Source code from file:  Strategy.java

package designPatterns.Strategy;

public interface Strategy {
public void strategy();
}

// Source code from file:  User.java

package designPatterns.Strategy;

public class User {
public static void main(String[] args) {
Context ctxt = new Context();
ctxt.strategy('A');
ctxt.strategy('B');
}
}
[/java]

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

相关文章

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 及传感器都可归为载体标识。当需要用到不同体系下的标识符时,如何处理不同标识符之间的兼容性等问题呢?这个时候,三大国际组…

SIFT+RANSAC做图像矫正

做图像矫正时使用了一下sift算法,尽管sift确实很牛,但还是会出现一些误匹配,直接计算两张影像的单应矩阵会出现很大误差,因此可以在计算时使用RANSAC算法在单应矩 阵的约束下剔除误匹配,并计算单应矩阵,基…