策略模式(Strategy Pattern)

策略模式 (Strategy Pattern)

定义

它是将定义的算法家族、分别封装起来,让它们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。
可以避免多重分支的 if-else、switch语句。

属于行为型模式。

适用场景

  1. 如果系统中有很多类,而他们的区别仅在于它们的行为不同。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 需要屏蔽算法规则。

标准示例

在这里插入图片描述
IStrategy:策略抽象类

public interface IStrategy{void algorithm()
}

ConcreteStrategyA:具体策略A

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

ConcreteB: 具体策略B

public class ConcreteStrategyB implements IStrategy{public void algorithm(){System.out.println("Strategy B");}
}

Context:上下文,用来操作策略的决策层面,会开放给客户端。

public class Context{private IStrategy strategy;public Context(IStrategy strategy){this.strategy = strategy;}public void algorithm(){strategy.algorithm();}
}

ClientTest

public class ClientTest{public static void main(String[] args){//选择具体策略IStrategy strategy = new ConcreteStrategyA();//上下文Context context = new Context(strategy);//执行上下文的算法context.algorithm();		}
}	

策略模式封装了算法,在实际中,各种电商的优惠活动,经常会有不同的计算方法。我们就通过一个优惠的例子来看一下,策略模式的应用。
我们先提供一个抽象的优惠策略类 PromotionStrategy
然后创建4个优惠策略实现类:
CouponStrategyGroupBuyStrategyCashRefundStrategyDefaultStrategy
最后,通过 策略的上下文,来实现策略的调用:StrategyContext

public abstract class PromotionStrategy {abstract void promotionCalculate();
}
public class CouponStrategy extends PromotionStrategy{void promotionCalculate() {System.out.println("coupon strategy ...");}
}
public class GroupBuyStrategy extends PromotionStrategy{void promotionCalculate() {System.out.println("group buy strategy ...");}
}
public class CashRefundStrategy extends PromotionStrategy{void promotionCalculate() {System.out.println("cash refund strategy...");}
}
public class DefaultStrategy extends PromotionStrategy{void promotionCalculate() {System.out.println("default strategy ...");}
}
public class StrategyContext {private static Map<String, PromotionStrategy> PROMOTIONS = new HashMap<String, PromotionStrategy>();//对算法进行了封装static {PROMOTIONS.put("COUPON", new CouponStrategy());PROMOTIONS.put("GROUPBUY", new GroupBuyStrategy());PROMOTIONS.put("CASHREFUND", new CashRefundStrategy());}//使得调用方通过传入String,即可选择相应的算法public PromotionStrategy getPromotion(String promotion) {PromotionStrategy strategy = PROMOTIONS.get(promotion);return strategy == null ? new DefaultStrategy() : strategy;}
}

客户端调用类:

public class ClientTest {public static void main(String[] args) {StrategyContext context = new StrategyContext();PromotionStrategy strategy = context.getPromotion("COUPON");strategy.promotionCalculate();}
}

输出结果:

coupon strategy ...

以上就是策略模式的全部内容,感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现货黄金如何操作:黄金技术性止损的运用

止损是现货黄金如何操作中不得不提及的方法。在现货黄金投资过程中&#xff0c;风险是存在的&#xff0c;重要的是如何将风险把控好。这里的一个重要概念就是&#xff0c;要对每一笔交易设定好止损&#xff0c;可以讲&#xff0c;这就是现货黄金如何操作的方法中最重要的一种。…

如何降低MCU系统功耗?

大家在做MCU系统开发的时候&#xff0c;是否也碰到过降低MCU系统功耗的需求&#xff1f; MCU系统整板功耗是个综合的数据&#xff0c;包括MCU功耗以及外部器件功耗&#xff0c;在此我们主要介绍如何降低MCU的功耗&#xff1a; 可以在满足应用的前提下&#xff0c;降低MCU的运…

单片机里面中断状态寄存器是什么

中断状态寄存器是存在于许多微控制器和硬件设备中的一个特殊类型的寄存器&#xff0c;用于指示发生了哪些中断事件。当中断发生时&#xff0c;相应的中断状态寄存器中的一个或多个位会被硬件设置为1。软件可以通过读取这个寄存器来确定哪些中断需要处理&#xff0c;并通过写回特…

top和ps的cpu区别

CPU使用率计算方式&#xff1a; top 命令计算的是在固定时间间隔内&#xff0c;每个进程占用CPU的时间百分比&#xff0c;因此它能反映进程的实时CPU使用情况。top 中的CPU使用率之和可能超过100%&#xff0c;因为在多核系统中&#xff0c;每个核心的使用率可以单独计算&#…

合约期VS优惠期,搞明白他们的区别才能避免很多坑!

在购买流量卡时&#xff0c;相信大家也都发现了&#xff0c;市面上的不少套餐都是有合约期和优惠期的&#xff0c;尤其是联通和移动&#xff0c;那么&#xff0c;什么是合约期&#xff1f;什么又是优惠期呢&#xff1f; ​ 其实&#xff0c;目前很多在网上办理的大流量卡都是有…

PHP的最新版本是什么?它引入了哪些新特性?

PHP&#xff08;全称&#xff1a;PHP&#xff1a;Hypertext Preprocessor&#xff0c;即"PHP&#xff1a;超文本预处理器"&#xff09;是一种通用开源脚本语言&#xff0c;主要用于服务器端编程。它在服务器上执行&#xff0c;能够生成动态页面内容、处理表单数据、发…

网络安全入门必选:十款免费的抓包工具有哪些?

下面给大家推荐几款好用的免费的抓包工具软件&#xff0c;有需要的小伙伴们来了解一下。 1. Wireshark抓包分析工具 4.0.1 Wireshark是一款功能强大的网络协议分析器&#xff0c;可以实时检测和抓取网络通讯数据。它支持多种协议和媒体类型&#xff0c;并具备丰富的显示过滤…

前端写代码真的有必要封装太好么?

前言 封装、代码复用、设计模式…… 这些都是方法&#xff0c;业务才是目的。技术始终是为业务服务的。能够满足业务需求&#xff0c;并且用起来舒服的&#xff0c;都是好方法。 不存在一套适用于所有项目的最佳代码组织方法&#xff0c;你需要结合业务&#xff0c;去不断地…

计算机视觉与人工智能领域常用期刊和会议缩写

在撰写论文时有时候会面临超篇幅的情况&#xff0c;这时候一个常用的操作便是使用期刊&#xff08;会议&#xff09;的缩写或者半缩写来替换期刊&#xff08;会议&#xff09;全称 为了方便自己后续使用相关的缩写 特此整理 如有不当之处 欢迎大家指正~~ 计算机视觉与人工智能…

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞&#xff08;一&#xff09; 专项漏洞部分注重测试方法论&#xff0c;每个专项仅列举一个例子。实际测试过程中&#xff0c;需视情况而定。 文章目录 Web应用安全测试-专项漏洞&#xff08;一&#xff09;Web组件&#xff08;SSL/WebDAV&#xff09;漏…

vue3爷孙组件通信——provide和inject

父组件中提供数据&#xff0c;并在子组件中注入这些数据&#xff0c;从而实现了组件之间的数据传递。可用于兄弟组件通信&#xff0c;爷孙组件通信&#xff0c;父子通信。 provide( ‘注入名’, 注入值" ) 和 inject(‘注入名’) 第一代组件&#xff1a; <template>…

2024十大首码地推拉新app平台,一手首码对接平台!

到了2024年&#xff0c;地推新应用的接单平台成为创业者们关注的焦点。对于地推行业的从业人员而言&#xff0c;选择一家拥有一手单资源的平台至关重要&#xff0c;因为这直接关系到他们的利益。 2024年如果想要进行app地推活动&#xff0c;却没有人脉渠道的困扰&#xff0c;建…

Jmeter+InfluxDB+Grafana性能测试数据展示

JmeterInfluxDBGrafana提供了一种更好的对Jmeter压测结果的实时监控展示。可以理解为数据源产生的数据加上时间记录并存储&#xff0c;然后使用各种开源图表组件进行展示。实现jmeter报告的更好的可视化展示 1&#xff09;方便测试结果数据落地以及更好的分析 2&#xff09;将…

vue引入并使用物理引擎matter.js

1.效果 vue引入并使用物理引擎matter.js 2.什么是matter.js? Matter.js 是一个开源的2D物理引擎&#xff0c;专为Web浏览器设计&#xff0c;使用JavaScript编写。它允许开发者在网页上创建包含物理交互的动态图形和游戏。Matter.js 提供了一系列强大的功能&#xff0c;使得模拟…

flag-gems的装饰器point-wise分析

一 函数入口 def pointwise_dynamic(f: Optional[JITFunction] = None,*,num_inputs: Optional[int] = None,is_tensor: Optional[List[bool]] = None,dtypes: Optional[List[Optional[type]]] = None,num_outputs: Optional[int] = None,output_dtypes: Optional[List[type]]…

vue3 +elementPlus上传照片墙

获取到照片字符串然后push到fileList对应的URL中 if (formData.value.pictures) {let zz formData.value.pictures.split(",")zz.forEach((item) > {fileList.value.push({ url: item })})}对应表单 <el-form-item label"内容详情图"><el-up…

【数据集管理】使用 Fiftyone 管理数据集,大型数据集也不在话下!

【数据集管理】使用 Fiftyone 管理数据集&#xff0c;大型数据集也不在话下&#xff01; 1. Fiftyone 安装2. 数据集的加载与导出2.1 本地数据集操作2.1.1 创建 session2.1.2 加载数据集2.1.2.1 加载 YOLO 格式的数据集2.1.2.2 加载本地数据库中的数据集2.1.2.3 同时加载数据集…

2024《汽车出海全产业数据安全合规发展白皮书》下载

随着中国制造向中国智造目标的迈进&#xff0c;中国汽车正以前所未有的速度和质量&#xff0c;在全球市场上开疆拓土。不过&#xff0c;在中国汽车加快出海步伐的过程中&#xff0c;数据安全合规风险管理成为车企不容忽视的课题。 6月25日&#xff0c;在中国&#xff08;上海&…

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…

银行批处理系统设计模块

银行批处理系统是一种关键的后台处理系统&#xff0c;它通常在非高峰时段处理大量交易和数据。这种系统的设计需要考虑高可靠性、安全性、准确性和效率。以下是设计银行批处理系统时可能包含的一些核心模块&#xff1a; 1. **输入模块**&#xff1a; - 负责接收各种来源的数…