策略模式--Java篇
2016-04-27 10:10
357 查看
[b]策略模式(Strategy):[/b]它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
下面将以商场打折为例子,说明策略模式。商场收银如何促销,用打折还是返利其实都是一些算法,用简单工厂来生产算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式。
1.Strategy类,定义所有支持的算法的公共接口:
2.ConcreteStrategy,封装了具体的算法或行为,继承与strategy
3.Context,用一个ContreteStrategy来配置,维护一个对strategy对象的引用。
4.测试用例:
5.测试结果:
下面将以商场打折为例子,说明策略模式。商场收银如何促销,用打折还是返利其实都是一些算法,用简单工厂来生产算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式。
1.Strategy类,定义所有支持的算法的公共接口:
package com.lujie; //抽象算法类 public interface CashSuper { //算法方法 public abstract double acceptCash(double money); }
2.ConcreteStrategy,封装了具体的算法或行为,继承与strategy
package com.lujie; //打折收费子类 public class CashRebate implements CashSuper{ private double moneyRebate=1d; public void setMoneyRebat(double moneyRebat) { this.moneyRebate = moneyRebat; } public double getMoneyRebat() { return moneyRebate; } @Override public double acceptCash(double money) { return money*moneyRebate; } public CashRebate(String moneyRebate) { // TODO Auto-generated constructor stub this.moneyRebate=Double.valueOf(moneyRebate).doubleValue(); } }
package com.lujie; //返利收费子类 public class CashReturn implements CashSuper{ private double moneyCondition=0.0d; private double moneyReturn=0.0d; public void setMoneyCondition(double moneyCondition) { this.moneyCondition = moneyCondition; } public void setMoneyReturn(double moneyReturn) { this.moneyReturn = moneyReturn; } public double getMoneyCondition() { return moneyCondition; } public double getMoneyReturn() { return moneyReturn; } public CashReturn(String moneyCondition,String moneyReturn) { // TODO Auto-generated constructor stub this.moneyCondition=Double.valueOf(moneyCondition).doubleValue(); this.moneyReturn=Double.valueOf(moneyReturn).doubleValue(); } @Override public double acceptCash(double money) { // TODO Auto-generated method stub double result=money; if(money>=moneyCondition) result=money-Math.floor(money/moneyCondition)*moneyReturn; return result; } }
package com.lujie; //正常收费子类 public class CashNormal implements CashSuper{ @Override public double acceptCash(double money) { // TODO Auto-generated method stub return money; } }
3.Context,用一个ContreteStrategy来配置,维护一个对strategy对象的引用。
package com.lujie; //策略模式 public class CashContext { private CashSuper cs;//声明一个CashSuper对象 public CashContext(String type) {//注意参数不是具体的收费策略对象, //而是一个字符串,表示收费类型 //初始化时,传入具体的策略对象 switch (type) { case "正常收费": CashNormal cs0=new CashNormal();//根据具体的策略对象,调用器算法的方法 cs=cs0; break; case "满300返100": CashReturn cs1=new CashReturn("300","100"); cs=cs1; break; case "打8折": CashRebate cs2=new CashRebate("0.8"); cs=cs2; break; //将实例化具体策略的过程由客户端转移到Context类中,简单工厂的应用 } } public double getResult(double money) { return cs.acceptCash(money); } }
4.测试用例:
package com.lujie; public class testStrategyMethod { public static void main(String[] args) { testStrategyMethod test=new testStrategyMethod(); test.getResult("正常收费"); test.getResult("满300返100"); test.getResult("打8折"); } public void getResult(String type) { double total=0.0d; // TODO Auto-generated method stub CashContext csSuper=new CashContext(type); double totalPrices=0d; totalPrices=csSuper.getResult(3000); total=total+totalPrices; System.out.println(type+"为:"+total); } }
5.测试结果:
相关文章推荐
- java异常体系
- Java多线程编程实战指南(设计模式篇,黄文海)-之管道线模式
- java中静态代码块的用法 static用法详解
- studio中java文件右下角显示红色j而不是C标识
- JAVA中字符串函数subString的用法小结
- Java文件路径
- java继承关系中成员变量,构造方法,成员方法的关系
- Java中的异常注意点
- Maven那点事儿(Eclipse版)
- 解决mac10.11 提示的未安装java1.6的问题
- Java集合---HashMap源码剖析
- java.net.BindException: Address already in use解决方法
- Spring 4支持的Java 8新特性一览
- 解决Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be exe
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
- HBase的Java接口基本操作:创建表插入查询删除
- HDFS原理、命令行接口和Java接口
- java编译出错信息汇总(更新)
- Spring的事务管理
- 72、java中如何取得当天是本年的第多少周?