社区编辑申请
注册/登录
策略模式—多场景下的行为标兵
开发 前端
策略模式是指不同类之间有相同的行为,但是行为的具体表现形式又互不相同,在运行时可以动态选择具体要执行的行为的模式。

程序员小刘最近很恼火,公司新上马了一个电商促销项目,以发放优惠券的形式来达到商品促销的目的。可是项目上线一段时间后活动进行的并不理想,产品经理一顿分析,认为是促销力度不够,需结合多种形式的活动来达到促销的目的,于是接二连三的找到小刘,今天加一个打折促销活动,明天加一个满减促销活动。。。小刘无奈只能加班加点的改动代码,本就稀少的头发又不见了几根。

你作为小刘的资深基友,看着他的一堆if else,眉头微皱,说道,你这样不行啊,鬼知道这产品经理还有什么馊主意,你这种情况建议用策略模式梳理一下,后期扩展也很方便。小刘一听,两只熊猫眼一簇,问道,策略模式,什么玩意?望着好基友疑惑的眼神,你推了推眼镜,开启了教学模式。

什么是策略模式?

策略模式是指不同类之间有相同的行为,但是行为的具体表现形式又互不相同,在运行时可以动态选择具体要执行的行为的模式。以小刘的业务场景为例,各种促销活动互不相同,但是他们又有一个共同的行为——让商品价格降低,但是每个活动的计算方法又不相同。

设想,如果不使用策略模式,当用户选择参加某种活动后,我们的代码中将会出现一系列的判断,如果是使用优惠券,那么根据优惠券规则计算商品价格,如果是参加打折促销,那么根据打折促销规则计算商品价格,如果是参加满减活动,那么根据满减活动规则计算商品价格。。。这样无疑是灾难性的。

那来看看用策略模式,这种场景将如何实现。

策略模式中,有三个基本角色:

  • strategy:抽象策略角色,定义了共同的行为(计算商品价格)。
  • concreteStrategy:具体的策略类,需要实现strategy,并重写自己的行为方法。
  • contextStrategy:策略上下文,持有策略角色,供客户端调用。

我们按照这三种角色在代码中实现一下。

1、定义策略角色接口strategy

我这里用的接口形式,当然也可以用抽象类。

2、定义具体的策略类

在这个场景中,我们定义三个促销活动的策略类,分别是优惠券活动、折扣活动、满减活动。

优惠券策略类

折扣活动策略类

满减活动策略类

3、定义上下文

上下文策略类中,会持有策略类,并能够执行策略的行为方法

4、测试

假设用户参加了折扣活动,那在我们的上下文策略类中,我们将选择的折扣策略传入,然后再执行,就会直接在折扣策略类中执行相应的计算。

以上就是一个简单的策略模式的实现过程。使用这种方式,将每个策略的实现方式对外隐藏,而是通过上下文去执行具体的策略方法,如果需要进行扩展,也不需要修改上下文,只需将新增的策略类加上即可,通过上下文去进行调用,很容易对代码进行维护。

策略模式与工厂模式的渊源

了解工厂模式的同学可能会有些疑惑(不了解的同学可以查看另一篇文章​​设计模式之工厂模式——要的是工厂而不是作坊​​,这与工厂模式也太像了吧。是的,策略模式与工厂模式在代码结构上是非常相似的,而且上文中提到的业务场景,使用工厂模式,也是可以实现的。只不过使用工厂模式,我们首先拿到的是目标对象,拿到目标对象后,再去执行对应的方法,而策略模式,则是直接去执行目标方法。这两个模式的侧重点是不同的,一个是侧重于生成对象,一个是侧重于实现行为。

实际上,策略模式往往要结合工厂模式进行使用。在上文的测试方法中,我们直接把折扣策略类new出来去执行策略方法,而在实际应用中,客户端调用不可能将一个对象传过来,往往是传一个类型代码,或者数字,比如传数字1表示优惠券,传数字2表示折扣,传数字3表示满减,我们在拿到数字后,可以结合工厂模式获取具体的策略类的对象,再通过策略模式执行目标方法,这样在整体的结构上,就会比较清晰。

责任编辑:姜华 来源: 今日头条
相关推荐

2022-04-14 10:10:59

Nginx开源Linux

2022-05-18 10:58:36

LinuxKali Linux

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-05-20 14:54:33

数据安全数字化转型企业

2022-04-19 14:41:29

Oracle数据库SQL

2022-05-05 15:56:43

数字化转型锐捷网络

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-04-12 09:48:22

云计算安全云服务云安全

2022-04-23 17:49:05

元宇宙51CTOMetaCon

2022-04-28 20:24:44

华为华为终端

2022-05-24 07:51:05

测试模型测试单元测试

2022-05-07 09:08:13

路由策略网络规划

2022-05-06 16:31:27

人工智能自然语言生物特征识别

2022-05-09 11:19:12

CSS函数开源

2022-04-20 11:57:30

物联网人工智能

2022-04-19 06:20:14

CentOSLinux红帽

2022-05-06 09:21:21

TypeScriptinterfacetype

2022-05-21 23:46:16

自动驾驶雷达传感器

2022-05-09 16:33:03

EDR终端安全

2022-04-17 23:09:07

深度学习人工智能芯片

同话题下的热门内容

让程序员心动的11种新编程语言Flutter vs ReactJS:2022年应该选哪个?再有人问你什么是分库分表,直接把这篇文章发给他前端配置化真香~上班又多了60%的摸鱼时间2022年值得使用的 Node.js 框架HTTP 的缓存为什么这么设计?前端监控的搭建步骤,别再一头雾水了!如何加快Java中大型集合的处理

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号