设计模式-策略模式(Strategy)
2015-09-28 13:53
351 查看
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
以下通过商场在各种活动模式下的结算方式演示了策略模式与简单工厂模式的结合
1.创建收费基类
a.正常收费:
输出:
1000.0
800.0
700.0
5.总结
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是同样的工作,只是实现不同,他可以用相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。
以下通过商场在各种活动模式下的结算方式演示了策略模式与简单工厂模式的结合
1.创建收费基类
/** * 现金收费基类 * * @author WangPeng * * CashSuper.java 2015年9月28日 下午12:40:18 */ public abstract class CashSuper { /** * 现金结算函数 * * @param money 应收金额 * @return */ public abstract double acceptCash(double money); }2.列举可能的收费方式
a.正常收费:
/** * 正常收费子类 * * @author WangPeng * * CashNormal.java 2015年9月28日 下午12:42:38 */ public class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } }b.折扣收费:
/** * 折扣子类 * * @author WangPeng * * CashRebate.java 2015年9月28日 下午12:50:11 */ public class CashRebate extends CashSuper { /** * 折扣力度 */ private double moneyRebate = 1; public CashRebate(double moneyRebate) { this.moneyRebate = moneyRebate; } @Override public double acceptCash(double money) { return money * moneyRebate; } }c.返利收费
/** * 返利子类 (如:满300减100) * * @author WangPeng * * CashReturn.java 2015年9月28日 下午12:43:42 */ public class CashReturn extends CashSuper { private double moneyCondition = 0.0; private double moneyReturn = 0.0; public CashReturn(double moneyCondition, double moneyReturn) { this.moneyCondition = moneyCondition; this.moneyReturn = moneyReturn; } @Override public double acceptCash(double money) { if (money >= moneyCondition) { return money - Math.floor(money / moneyCondition) * moneyReturn; } return money; } }3.创建收费策略上下文
/** * 现金收费工厂 * * @author WangPeng * * CashFactory.java 2015年9月28日 下午1:41:34 */ public class CashContext { private CashSuper cs = null; 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; default: break; } } public double getResult(double money){ return cs.acceptCash(money); } }4.测试
public class Test { public static void main(String[] args) { // 测试收费 1000元 正常收费 CashContext cc1 = new CashContext("正常收费"); // 应付款700 System.out.println(cc1.getResult(1000)); // 测试收费 1000元 打8折 CashContext cc2 = new CashContext("打8折"); // 应付款800 System.out.println(cc2.getResult(1000)); // 测试收费 1000元 满300返100 CashContext cc3 = new CashContext("满300返100"); // 应付款700 System.out.println(cc3.getResult(1000)); } }
输出:
1000.0
800.0
700.0
5.总结
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是同样的工作,只是实现不同,他可以用相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。
相关文章推荐
- Magento中新建一个布局文件(自定义布局文件)
- 正则表达式校验文件路径
- apache中国地址镜像文件下载地址
- kafka+storm java代码
- CF#310-A-Case of the Zeros and Ones-链表模拟
- ios去掉navigationController和tabBarController里的边框黑线
- 排序算法九:基数排序
- 【转】移动测试人员的未来:测试开发技术的融合
- EditText在光标位置插入字符串
- JSF中使用jquery
- Android获取系统时间
- Firefox OS启动过程分析-system应用启动
- [leetcode 287]Find the Duplicate Number
- 如何深入理解 StatsD 与 Graphite ?
- liunx 定时器
- Android实现复制粘贴
- JAVA算法_快速排序
- protobuf-2.5.0安装
- 如何使Android应用程序获取系统权限
- flume读取日志数据写入kafka