Loading... # 设计模式(二)——策略模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为策略模式 - 策略模式是一种定义一系列算法的方法,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。 ## 用策略模式实现商场促销 之前我们用简单工厂模式实现了商场促销。 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.princelei.club/archives/67.html" target="_blank" class="post_inser_a no-external-link"> <div class="inner-image bg" style="background-image: url(https://www.princelei.club/usr/themes/handsome/assets/img/sj/7.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">设计模式(一)——简单工厂模式</p> <div class="inster-summary text-muted"> 设计模式(一)——简单工厂模式参考大话设计模式  ——  程杰 著目录设计... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 在这里,原来写的CashSuper、CashNormal、CashRebate、CashReturn都不用更改。我们需要添加一个CashContext类,并更改一下客户端调用。 ``` /** * 现金收费抽象类 */ public interface CashSuper { double acceptCash(double money); } ``` ``` /** * 正常收费子类 */ public class CashNormal implements CashSuper{ /** * 正常收费,原价返回 * @param money * @return */ @Override public double acceptCash(double money) { return money; } } ``` ``` /** * 打折收费子类 */ public class CashRebate implements CashSuper { private double moneyRebate = 1d; /** * 初始化时传入打折倍率 * @param moneyRebate */ public CashRebate(String moneyRebate) { this.moneyRebate = Double.valueOf(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } } ``` ``` /** * 返利收费子类 */ public class CashReturn implements CashSuper { //返利条件 private double moneyCondition = 0.0d; //返利值,如满300反100 private double moneyReturn = 0.0d; public CashReturn(String moneyCondition, String moneyRetuen) { this.moneyCondition = Double.valueOf(moneyCondition); this.moneyReturn = Double.valueOf(moneyRetuen); } @Override public double acceptCash(double money) { if (money >= moneyCondition) { money = money - Math.floor(money / moneyCondition) * moneyReturn; } return money; } } ``` ``` /** * CashContext */ public class CashContext { //声明一个CashSuper对象 private CashSuper cs = null; //通过传入不同的参数,创建不同的收费实例,与简单工厂模式结合, //将实例化具体策略的过程放到CashContext类中 public CashContext(String type) { switch (type) { case "正常收费": cs = new CashNormal(); break; case "满300返100": cs = new CashReturn("300", "100"); break; case "打8折": cs = new CashRebate("0.8"); break; } } public double getResult(double money) { return cs.acceptCash(money); } } ``` ``` /** * 客户端程序 */ public class MainClass { enum CbxType { NORMAL("正常收费"), REBATE("打8折"), RETURN("满300返100"); String type = ""; CbxType(String type) { this.type = type; } } public static void main(String[] args) { CashContext context = new CashContext(CbxType.RETURN.type); double price = 100d; double total = 10d; System.out.println(context.getResult(price * total)); } } ``` 对比简单工厂模式与策略模式的客户端调用 - 简单工厂模式 ``` CashSuper cs = CashFactory.createCashAccept(CbxType.RETURN.type); double price = 100d; double total = 10d; System.out.println(cs.acceptCash(price * total)); ``` - 策略模式 ``` CashContext context = new CashContext(CbxType.RETURN.type); double price = 100d; double total = 10d; System.out.println(context.getResult(price * total)); ``` 简单工厂模式需要让客户端认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合的用法只需要客户端认识一个CashContext就可以了,耦合更加降低。 Last modification:November 27th, 2020 at 06:10 pm © 允许规范转载
?诗歌散文评语?