设计模式学习之策略模式

写代码时总会出很多的if…else , 或者case 。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿 , 维护的成本也会加大 , 而策略模式就能较好的解决这个问题 , 本篇博客就带你详细了解策略模式 。
策略模式的定义和使用场景
**定义:**策略模式定义了一系列的算法 , 并将每一个算法封装起来 , 而且使他们可以相互替换 , 让算法独立于使用它的客户而独立变化 。
【设计模式学习之策略模式】分析下定义 , 策略模式定义和封装了一系列的算法 , 它们是可以相互替换的 , 也就是说它们具有共性 , 而它们的共性就体现在策略接口的行为上 , 另外为了达到最后一句话的目的 , 也就是说让算法独立于使用它的客户而独立变化 , 我们需要让客户端依赖于策略接口 。
策略模式的使用场景:
1.针对同一类型问题的多种处理方式 , 仅仅是具体行为有差别时;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类 , 而又需要使用 if-else 或者 -case 来选择具体子类时 。
UML类图
这个模式涉及到三个角色:

设计模式学习之策略模式

文章插图
环境()角色:持有一个的引用 。
抽象策略()角色:这是一个抽象角色 , 通常由一个接口或抽象类实现 。此角色给出所有的具体策略类所需的接口 。
具体策略()角色:包装了相关的算法或行为 。
策略模式的典型代码如下:
抽象策略类
public interface Strategy {/*** 策略方法*/public void strategyInterface();}
具体策略类
public class ConcreteStrategyA implements Strategy {@Overridepublic void strategyInterface() {//相关的业务}}
public class ConcreteStrategyB implements Strategy {@Overridepublic void strategyInterface() {//相关的业务}}
环境角色类
public class Context {//持有一个具体策略的对象private Strategy strategy;/*** 构造函数 , 传入一个具体策略对象* @param strategy具体策略对象*/public Context(Strategy strategy){this.strategy = strategy;}/*** 策略方法*/public void contextInterface(){strategy.strategyInterface();}}
策略模式例子
假设鹅厂推出了3种会员 , 分别为会员 , 超级会员以及金牌会员 , 还有就是普通玩家 , 针对不同类别的玩家 , 购买《王者农药》皮肤有不同的打折方式 , 并且一个顾客每消费10000就增加一个级别 , 那么我们就可以使用策略模式 , 因为策略模式描述的就是算法的不同 , 这里我们举例就采用最简单的 , 以上四种玩家分别采用原价(普通玩家) , 九折 , 八折和七价的收钱方式 。
那么我们首先要有一个计算价格的策略接口
public interface CalPrice {//根据原价返回一个最终的价格Double calPrice(Double orgnicPrice);}
下面是4种玩家的计算方式的实现
public class Orgnic implements CalPrice {@Overridepublic Double calPrice(Double orgnicPrice) {return orgnicPrice;}}
public class Vip implements CalPrice {@Overridepublic Double calPrice(Double orgnicPrice) {return orgnicPrice * 0.9;}}
public class SuperVip implements CalPrice {@Overridepublic Double calPrice(Double orgnicPrice) {return orgnicPrice * 0.8;}}
public class GoldVip implements CalPrice {@Overridepublic Double calPrice(Double orgnicPrice) {return orgnicPrice * 0.7;}}