策略模式
来源:互联网 发布:sql查看创建表语句 编辑:程序博客网 时间:2024/06/05 06:03
定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式类图:
右边是策略接口以及它的实现类,左边是一个上下文,这个上下文会拥有一个策略,策略可以随意替换。这个上下文还含有个方法调用策略接口的方法。
例子:
商店的收费系统,有不同的收费模式。正常收费,打8折,满300减100。这3种收费模式,就是对应的具体策略,就是类图上面的StrategyA,StrategyB,StrategyC。这三种收费模式共同点都是收费,所以能够抽取一个共同的接口,3种收费模式分别实现该接口。至于上下文,主要管理策略模式,并提供方法给客户端调用。
定义收费的接口类:
package com.hjw.strategy;public interface CashSuper { public double acceptCash(double money);}
正常收费的实现类:
package com.hjw.strategy;public class CashNormal implements CashSuper { @Override public double acceptCash(double money) { return money; }}
打8折的实现类:
package com.hjw.strategy;public class CashRebate implements CashSuper { private double moneyRebate = 1; public CashRebate(String moneyRebate) { this.moneyRebate = Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; }}
满300减100的实现类:
package com.hjw.strategy;public class CashReturn implements CashSuper { private double moneyCondition = 0; private double moneyReturn = 0; public CashReturn(String moneyCondition, String moneyReturn) { this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result = money; if(money >= moneyCondition){ result = money - Math.floor(money/moneyCondition) * moneyReturn; } return result; }}
最关键的上下文类:
package com.hjw.strategy;public class CashContext { private CashSuper cs; 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); }}
客户端(使用策略模式):
package com.hjw.strategy;public class Test { public static void main(String[] args) { CashContext csuper = new CashContext("正常收费"); System.out.println(csuper.getResult(100)); csuper = new CashContext("满300减100"); System.out.println(csuper.getResult(100)); csuper = new CashContext("打8折"); System.out.println(csuper.getResult(100)); }}
启发:
- 低耦合。使用方,也就是客户端。只需要知道上下文,这个类即可,不需要与具体的实现类捆绑在一起。
- 每个类负责单一功能。正常收费,打8折,满300减100的完全可以写到一个类里面,分开具体的实现类,负责单一的功能。同时也符合开-闭原则。对修改关闭,对扩展开放。譬如要增加一个打7折的收费方式,只需多增加一个实现类,上下文修改下。
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- PopUpWindow使用详解(二)——进阶及答疑
- caffe python 接口文档汇总
- Tree-----判断tree是不是BST(110. Balanced Binary Tree)
- HDOJ 1282 回文数猜想
- JAVA设计模式之工厂模式之抽象工厂模式
- 策略模式
- Android的帧动画、补间动画、属性动画
- 动态规划石子合并问题
- 1059. C语言竞赛
- 互逆素数
- JDBC 更新数据结构集操作
- Shell 脚本简记 -- 测试网络主机执行某段程序
- 环信使用沉浸式菜单栏输入框问题
- NYOJ-1238-最少换乘