网站建设做得好的公司,wordpress多种设备网页生成,智邦国际erp系统多少钱,高端终端网站设计类网站一、什么是策略模式
定义一些列算法类#xff0c;将每一个算法封装起来#xff0c;并让它们可以互相替换。
策略模式让算法独立于使用它的客户而变化#xff0c;是一种对象行为型模式。
以上是策略模式的一般定义#xff0c;属于是课本内容。
在没有真正理解策略模式之…一、什么是策略模式
定义一些列算法类将每一个算法封装起来并让它们可以互相替换。
策略模式让算法独立于使用它的客户而变化是一种对象行为型模式。
以上是策略模式的一般定义属于是课本内容。
在没有真正理解策略模式之前并不需要对此定义下过多功夫读一遍直接进入下一章节。
二、为什么要用策略模式
我们应该知道所谓的设计模式实际上是一种经过检验的、科学高效的、针对某种场景的最佳编程设计实践。
所以要理解某一种设计模式就必须知道我们什么时候可以用用之前和用之后到底有什么区别。
练习 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。 一个最简单的情况就是把所有货品的单价乘上数量但是实际情况肯定比这要复杂。 比如本网站可能对所有的高级会员提供每本20%的促销折扣对中级会员提供每本10%的促销折扣对初级会员没有折扣。 根据描述折扣是根据以下的几个算法中的一个进行的 算法一对初级会员没有折扣。 算法二对中级会员提供10%的促销折扣。 算法三对高级会员提供20%的促销折扣。 给出一本图书如300元若是高级会员则输出价格为240元。 针对以上场景大多数的我们写的代码就是使用的if…else…。
我们先提前揭晓这种场景下就是我们使用策略模式的最佳时机。
那在我们尝试使用策略模式改进代码之前我们必须要问
if…else到底有什么问题
传统实现方式
public Double calculationPrice(String type, Double originalPrice, int n) {//中级会员计费if (type.equals(intermediateMember)) {return originalPrice * n - originalPrice * 0.1;}//高级会员计费if (type.equals(advancePrimaryMember)) {return originalPrice * n - originalPrice * 0.2;}//普通会员计费return originalPrice;
}
这种编码方式到底差在哪
大佬告诉我们说维护性差。
什么叫维护性差
就是下次你想加个超级黄金vip会员以及各种后续会员种类你就要不断往里加if…else…这就违反了开闭原则。
这里又有另外两个问题
什么是开闭原则我凭啥要遵守开闭原则
什么是开闭原则
开闭原则比较好记忆顾名思义
对扩展开放对修改关闭。
大意就是你想改东西不要改原代码而是进行扩展代码。
为什么要遵守开闭原则以及各种乱七八糟的原则?
简单直接一点就是这些原则都是巨佬们总结出来的你如果不懂你就直接选择相信就好了。
解释一下就是
系统随着开发的不断进展需求不断增多代码越来越长如果没有合理框架的制约那就只能沦为一个扩展难、维护难的屎山。
所以我们遵守开闭原则就是说需要一个科学合理的框架规范我们的系统熵增在不修改原代码的基础上让系统拥有灵活性和稳定性。
一句话上面的代码直接修改原代码时间久了系统只会沦为屎山。
那怎么使用策略模式改造而遵守开闭原则呢
策略模式如何实现
Strategy抽象策略类
它为所支持的算法声明抽象方法是所有策略类的父类。它可以使抽象类或者具体类也可以是接口。
public interface MemberStrategy {// 一个计算价格的抽象方法//price商品的价格 n商品的个数public double calcPrice(double price, int n);
}ConcreteStrategy具体策略类
它实现了上面抽象策略类的抽象方法。
在实际运行中这个具体的策略类将会代替在**环境类Context**中定义的抽象策略类对象最终执行不同的实现逻辑。
可以看到下面的代码中三种不同的策略类实现了同一个抽象策略类每种策略对应一种实现分别应对一个业务处理方式。
// 普通会员——不打折
public class PrimaryMemberStrategy implements MemberStrategy { // 实现策略Overridepublic double calcPrice(double price, int n) {return price * n;}
}// 中级会员 打百分之10的折扣
public class IntermediateMemberStrategy implements MemberStrategy{Overridepublic double calcPrice(double price, int n) {double money (price * n) - price * n * 0.1;return money;}
}// 高级会员类 20%折扣
public class AdvanceMemberStrategy implements MemberStrategy{Overridepublic double calcPrice(double price, int n) {double money price * n - price * n * 0.2;return money;}
}Context环境类
这个对我来说一开始很难理解。
主要是不能理解 Context 这个词在这里的意思再加上网上一大堆直接翻译为“上下文”的文章博客我直接吐了
我不理解Context的意思难道就能理解“上下文”的意思
还有类似的事务又是什么东西
所以我直接不管这个Context是什么东西直接看代码。
首先他是一个类我们看这个类里有什么。
一个成员变量memberStrategy
一个构造方法
一个计算价格的方法内容返回memberStrategy的calcPrice方法
往下看。
/*** 负责和具体的策略类交互* 这样的话具体的算法和直接的客户端调用分离了使得算法可以独立于客户端独立的变化。*/// 上下文类/环境类
public class MemberContext {// 用户折扣策略接口private MemberStrategy memberStrategy;// 注入构造方法public MemberContext(MemberStrategy memberStrategy) {this.memberStrategy memberStrategy;}// 计算价格public double qoutePrice(double goodsPrice, int n){// 通过接口变量调用对应的具体策略return memberStrategy.calcPrice(goodsPrice, n);}}
接下来看测试类中 Context 类的使用是什么样子的。 // 测试类public class Application {public static void main(String[] args) {// 具体行为策略MemberStrategy primaryMemberStrategy new PrimaryMemberStrategy(); // 接口回调向上转型MemberStrategy intermediateMemberStrategy new IntermediateMemberStrategy();MemberStrategy advanceMemberStrategy new AdvanceMemberStrategy();// 用户选择不同策略MemberContext primaryContext new MemberContext(primaryMemberStrategy);MemberContext intermediateContext new MemberContext(intermediateMemberStrategy);MemberContext advanceContext new MemberContext(advanceMemberStrategy);//计算一本300块钱的书System.out.println(普通会员的价格 primaryContext.qoutePrice(300,1));// 普通会员300System.out.println(中级会员的价格 intermediateContext.qoutePrice(300,1));// 中级会员 270System.out.println(高级会员的价格 advanceContext.qoutePrice(300,1));// 高级会员240}}发现了什么
Context都是被new出来的new的时候传入的Strategy实现类全部不一样你传的不一样将来context.calcPrice()执行的逻辑就不一样。
懂了没有
什么是上下文
什么是Context
就是随机应变像变色龙一样随着不同的环境变化而自由变化。
开发者根据“上下文”不同的业务需求往Context里面放置不同的Strategy。
这就是Context上下文的意思。
这里的Strategy可以你自己new你也可以把它放在配置类里面配置然后在代码中读取这样更加灵活方便。
三、使用策略模式的场景总结
那我们知道了策略模式怎么实现也就是已经有了一把锤子在手上了那什么时候用这把锤子呢
1. 系统中需要动态地在几种算法中选择一种。
2. 一个对象有很多的行为如果不用策略模式就只能用一大堆的if…else…来实现。
3. 不希望客户端知道复杂的、与算法相关的数据结构。在具体策略类中封装算法和相关的数据结构提高算法的保密性与安全性。
然后我们用一些实际的例子来理解策略模式的大概的使用场景
1. 支付方式选择 假设平台支持多种支付方式比如微信、支付宝、银行卡等。
2. 数据渲染方式 如果你有一个应用程序它可以以多种格式输出数据比如XML、JSON或CSV。
3. 导航策略 导航应用多种路径计算方法如最快路线、最短路线、避开收费路线等。
4. 压缩数据 根据不同的情况比如压缩率、速度等使用不同的压缩算法如ZIP、RAR、7z等。
四、策略模式有什么好处
1. 完美支持了开闭原则。
2. 通过抽象算法和继承实现避免了大量重复代码。
3. 避免了多重选择语句硬编码不易维护。 往期推荐
● 师爷翻译翻译什么叫AOP
● 翻译师爷师爷什么叫事务
● 纪念JDBC
● SpringBoot实现动态数据源配置
● 聚簇索引、回表与覆盖索引
● Java锁到底是个什么东西