设计模式之策略者模式

策略者模式简介

策略者模式定义一个算法接口,并由其实现类去实现,使得每一个算法都得到封装,并让他们可以相互替换。这是一种行为型模式。策略者模式降低了算法行为和环境角色的耦合度,使得算法可以独立发生变化。

策略者模式在现实世界的使用很多,比如互金场景中的优惠券模式,可以分为本金券,返现券,加息券,增收券等,每种卡券给予用户享受不同的权益,如果有一天增加了新的优惠券,也很容易扩展进去。由此可见,策略者模式使得业务线索更加清晰明了,每种业务线索场景彼此互不关联,互不影响。

同时,由于并不强耦合企业业务,所以当有一天企业业务扩大,并同时需要对卡券进行进一步的权益扩展的时候,修改起来也会很方便,当然某些可变数据是可以通过配置来解决的,这也进一步减少了代码的修改。
当然,我们也可以看到,根据特定的场景,充分运用其规则,并通过配合一些常规手段来进一步完善和稳定系统功能的时候,可以把设计模式的威力进一步发挥出来,切记不可拘泥于设计模式本身。

策略者模式UML类图

640?wx_fmt=jpeg

由UML类图可知策略者模式分为三个角色

Context:此处负责抽象策略类调度具体的算法策略,根据某些具体场景的不同,Context也可以有不同的实现。
Strategy:抽象算法策略类,所以具体策略者的父类,定义了一个抽象的方法,可以是接口也可以是抽象类,我一般使用抽象类,因为我需要对一些数据进行特殊的处理后再交给子类。
ConcreteStrategy:具体的算法策略,具体实现抽象的方法。

范例

以下范例,会使用前面所说的互金场景下的卡券,对于用户来说,就是购买产品时所使用的卡券能为自己带来多少收益,所以此处把【用】这个算法抽象出来,由每种卡券自己去实现响应的算法

策略算法抽象类:

 

 

策略算法具体的四个卡券类

 

策略者上线文类,此处我提供了两种实现方式:

1、如果策略者上线文类比较简单,除了对象获取以外,没有其他特殊的使用,可以考虑类似于简单工厂的模式,毕竟,我们在开发卡券功能时,会提供相应的卡券类型枚举,此处可以借用一下

调用方式

2、另外一种实现方式,就是采用注入方式,这种实现方式一般用于策略者上下文类功能比较多的情况


调用方式

策略者模式优缺点

优点:

  • 很好的体现了开闭原则,开发者可以在不变更其他具体算法的基础上新增新的策略类,即便是策略者的具体场景发生变化,并需要大规模修改时,也会很容易,因为独立的场景总会带来特定的思维模式,让开发者不会被其他场景所干扰,也就是所谓的关注点分离。

  • 避免了大量的if-else

  • 算法可以自由切换

缺点:

  • 有可能会产生大量的策略类,并且所有策略类都会对外暴露

策略者模式使用场景思考

其实这一块我并不想写,因为写了以后,会给人一种思维定势,但是此处还是需要多讨论一下什么场景下去使用策略者模式,我们可以做一个这样的思考,当代码中或者即将编写的功能需要配合大量的if-else,其中的代码会较为复杂,并且这些产生if-else出现了较强的逻辑上的关联,外界也根本不关注其中的具体实现,在加入一层抽象层后,会使得这些功能更加聚合,更加明确,这个时候,可以考虑使用策略者模式。需要提醒的时候,策略者模式关注的是对象的行为,如果关注对象本身,可以使用简单工厂。


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

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

相关文章

Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp

传送门 文章目录题意:思路:题意: n≤1e5,m≤1e9,k≤8.n\le 1e5,m\le 1e9,k\le 8.n≤1e5,m≤1e9,k≤8. 思路: 注意到题目中保证了每个孩子至多收到kkk个,且k≤8k\le 8k≤8,注意到这是题目保证的&#xff0…

【NOI2015】品酒大会【后缀数组】【并查集】

传送门 传送门 题意:给一个长度为NNN的字符串和一个长度为NNN的序列AAA,对于所有的k∈[0,N−1]k \in [0,N-1]k∈[0,N−1],求选出两个数i,ji,ji,j满足lcp(suffix(i),suffix(j))≥klcp(suffix(i),suffix(j))\geq klcp(suffix(i),suffix(j))≥…

2021牛客第四场-E Tree Xor-线段树区间异或

https://ac.nowcoder.com/acm/contest/11255/E 题目大意:有n个点,每一点有一个区间[l,r]范围的权值可能,有n-1条边,边上的权值为w,ww(u)^w(v),问你满足权值范围和边权值的方案数。 思路:我们把树根的值设为0&#xff…

Codeforces Round #624 (Div. 3) D. Three Integers 数论

传送门 文章目录题意:思路:题意: 给定A,B,CA,B,CA,B,C,找到一个三元组(a,b,c)(a,b,c)(a,b,c),使得aaa是bbb的因子,bbb是ccc的因子,且abs(A−a)abs(B−b)abs(C−c)abs(A-a)abs(B-b)abs(C-c)abs(…

Gym - 100917F Find the Length-用最小路径树求最小环

https://codeforces.com/gym/100917/problem/F 题目大意:就给你一个无向图,求出所有点属于的最小环大小。 思路:我们给每一个点用dji求出最小路径树,然后对于一颗最小路径树,求环。 和树根构成环只有两种情况&#x…

【SPOJ2666】QTree4【链分治】

传送门 题意:给一棵带边权的树,每个点开始时为白色,维护两种操作: 1.改变一个点的颜色(白变黑,黑变白) 2.询问最远的两个白点之间的距离 树分治国集论文 链分治的本质其实就是树链剖分。它们…

【CF1200E】Compress Words【kmp】

传送门 题意:给NNN个由大小写字母、数字组成的字符串,两个字符串S,TS,TS,T合并时,删除TTT最长的是SSS的后缀的前缀,然后接在一起。现将这些字符串依次合并,求最终字符串。 N≤1e5,∑∣Si∣≤1e6N \leq 1e5,\sum|S_i|\leq 1e6N≤1…

Educational Codeforces Round 112 E.Boring Segments-线段树+双指针

https://codeforces.com/contest/1555/problem/E 这场的e好像比较简单。 题目大意,给你n个线段,最大点是m,每一个线段有一个权值w,你能选择线段来覆盖1-m这个区间的,选择的代价为最大权值和最小权值的差。问你最小的…

Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造

传送门 文章目录题意:思路:题意: 给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd。 n,d≤3000n,d\le 3000n,d≤3000. 思路: 先考虑不能构造出来的情况,设sumsumsum为最小…

多项式全家桶学习笔记【持续更新】

本文完成的时间跨度较长,文风变化可能较大…… 最近更新于2020年2月17日 Part 1.主线 乘法 前面讲过FFT 然而FFT常数感人,适用范围还窄,比如不能取模 于是有了NTT 其实就是取模的FFT FFT 需要用到复数ωcos(2πn)sin(2πn)i\omegacos…

2021牛客第五场 I.Interval Queries-回滚莫队

如图&#xff1a;一道很裸的回滚莫队&#xff0c;注意加入的操作和回滚的操作就好了。 #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #i…

Linux下搭建asp.net运行环境

最近有个项目&#xff0c;是在Windows平台下开发的&#xff0c;需要把 asp.net web应用移植到 CentOS下&#xff0c;甚是头疼&#xff1b;翻阅资料&#xff0c;发现Jexus是个可行的方案&#xff0c;下面是官方对Jexus的定义&#xff1a;什么是JexusJexus是一款Linux平台上的高性…

Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个点&#xff0c;mmm条边&#xff0c;限制xxx&#xff0c;每个点都有沥青aia_iai​&#xff0c;定义合并两个点即两点之间有边且auav≥xa_ua_v\ge xau​av​≥x&#xff0c;合并之后的沥青为auav−xa…

Codeforces Round #736 (Div. 2)E. The Three Little Pigs-长除法求多项式系数

https://codeforces.com/contest/1549/problem/E 题目大意自己悟吧&#xff0c;不解释了。 这题在赛时我想的是fft&#xff0c;但是题解说不用fft就能求出多项式的系数&#xff0c;fft在这题时间复杂度有点高。 使用多项式长除法就能求出系数&#xff0c;k^x的系数就是抓x个p…

在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

什么是跨站请求伪造跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的…

Codeforces Round #700 (Div. 1) C. Continuous City 构造 + 二进制

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 构造一个图&#xff0c;使其从111到nnn的路径的长度与[L,R][L,R][L,R]中某个值一一对应&#xff0c;不能有两条路径长度一样&#xff0c;且每个值都必须出现一次&#xff0c;每两个点之间只能连一条边。 n≤…

HDU2021多校第五天 1009 Array-树状数组求二阶前缀和

https://acm.hdu.edu.cn/showproblem.php?pid7020 题目大意&#xff1a;求出区间众数严格大于区间一半大小的子区间的数量。 思路&#xff1a;先对每一个数求出对应的位置排列&#xff0c;S[j]代表1-有多少个i&#xff0c;易得s[r]-s[l]>r-l-(s[r]-s[l])的时候子区间{l1&a…

C# 8 新增小功能

尽管 C# 8 应该会在今年发布&#xff0c;并且 C# 8.x 和 9 的路线图也开始形成&#xff0c;但是&#xff0c;微软正在继续审查下一个版本的特性。目标类型表达式假设我们有 A、B 和 C 三种类型&#xff0c;其中类型 B 和 C 是类型 A 的子类型。如果我们使用如下所示的语句&…

【SDOI2014】数表【莫比乌斯反演】【树状数组】

传送门 传送门 题意&#xff1a; TTT组询问给定n,m,an,m,an,m,a,求 ∑i1N∑j1M[(∑d∈N∗[d∣i][d∣j]d)≤a]∑d∈N∗[d∣i][d∣j]d\sum_{i1}^{N}\sum_{j1}^{M}[(\sum_{d \in N^*}[d\mid i][d \mid j]d)\leq a]\sum_{d \in N^*}[d\mid i][d \mid j]di1∑N​j1∑M​[(d∈N∗∑…

Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn台电脑&#xff0c;你可以手动打开某个电脑&#xff0c;如果第i−1,i1i-1,i1i−1,i1台电脑都打开了&#xff0c;那么第iii台电脑会自动打开。不能手动打开自动打开的电脑&#xff0c;问有多少种打开的方…