设计模式之我见--2 策略模式
2012-05-21 10:25
267 查看
本文所写都是自己的理解,可能会有错误,如果有错误请指出。
我们都看见过商场的促销,促销的方法可谓是五花八门,并且还不断出现新的促销方式,如果我们用一个程序来帮助商场计算促销后应该收的钱数,对于刚学编程的人可能就会用很多的switch。。。case或者if。。。else if。。。else。。。语句将商场的所有促销手段列到一个程序里,这个本没错,但是修改性扩展性比较差。学的好一点的可能会用简单工厂方法,但是也有一个弊端,对于简单工厂来说,它的思想是返回对应的对象,这里一般都是与现实事物对应。但是我们在这里的促销方式更像是一种方法,使用简单工厂虽然可以说的过去,但是总感觉有些别扭,另外如果商场变化促销方式,工厂类和对应促销方式都得修改。既然说了这些促销方式更像方法,那使用策略模式更加适合。
策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响使用算法的客户。
下面看一下类图
首先定义CashSuper,作为一个父类,然后分别有三个类继承了这个类,在三个继承类中定义不同的策略。
下面看一下代码:
策略模式更加侧重的是算法的变化,而简单工厂模式则侧重的是具体对象的变化,把握这两点的不同就可以进行区分了。另外这两个方法一般情况下是可以结合使用的,将策略的返回放入到简单工厂类中。
我们都看见过商场的促销,促销的方法可谓是五花八门,并且还不断出现新的促销方式,如果我们用一个程序来帮助商场计算促销后应该收的钱数,对于刚学编程的人可能就会用很多的switch。。。case或者if。。。else if。。。else。。。语句将商场的所有促销手段列到一个程序里,这个本没错,但是修改性扩展性比较差。学的好一点的可能会用简单工厂方法,但是也有一个弊端,对于简单工厂来说,它的思想是返回对应的对象,这里一般都是与现实事物对应。但是我们在这里的促销方式更像是一种方法,使用简单工厂虽然可以说的过去,但是总感觉有些别扭,另外如果商场变化促销方式,工厂类和对应促销方式都得修改。既然说了这些促销方式更像方法,那使用策略模式更加适合。
策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响使用算法的客户。
下面看一下类图
首先定义CashSuper,作为一个父类,然后分别有三个类继承了这个类,在三个继承类中定义不同的策略。
下面看一下代码:
package Cash; abstract class CashSuper { public abstract double acceptCash(double money); }
package Cash; public class CashNormal extends CashSuper { public double acceptCash(double money) { return money; } }
package Cash; public class CashRebate extends CashSuper { private double moneyRebate = 1d; public CashRebate(String moneyRebate){ this.moneyRebate = Double.parseDouble(moneyRebate); } public double acceptCash(double money) { return money * moneyRebate; } }
package Cash; public class CashReturn extends CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashReturn(String moneyCondition,String moneyReturn){ this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } public double acceptCash(double money) { double result = money; if(money>=moneyCondition) result = money - Math.floor(money/moneyCondition)*moneyReturn; return result; } }
package Cash; class CashContext { private CashSuper cs; public CashContext(CashSuper csuper){ this.cs = csuper; } public double GetResult(double money){ return cs.acceptCash(money); } }最后的是主程序:
package Cash; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class CashUI { public static void main(String[] args) { try { CashContext cc= null; System.out.println("1.正常收费"); System.out.println("2.满300返100"); System.out.println("3.打8折"); System.out.println("请选择:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int iselect= 0; iselect= Integer.parseInt(br.readLine()); switch(iselect) { case 1://正常收费 cc = new CashContext(new CashNormal()); break; case 2://满300返100 cc = new CashContext(new CashReturn("300","100")); break; case 3://打8折 cc = new CashContext(new CashRebate("0.8")); break; } double totalPrices = 0d; System.out.println("请输入总钱数:"); BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); double nowPrice = Double.parseDouble(br2.readLine()); totalPrices = cc.GetResult(nowPrice); System.out.println(totalPrices); } catch(IOException e){ System.out.println(e.getMessage()); } } }
策略模式更加侧重的是算法的变化,而简单工厂模式则侧重的是具体对象的变化,把握这两点的不同就可以进行区分了。另外这两个方法一般情况下是可以结合使用的,将策略的返回放入到简单工厂类中。
相关文章推荐
- 设计模式-策略模式
- 设计模式之策略模式
- 设计模式笔记:策略模式
- Java设计模式之策略模式
- 设计模式[策略模式和观察者模式]
- 设计模式之策略模式
- 设计模式 - 策略模式
- Strategy策略设计模式(对象行为型)
- 设计模式--行为型--策略模式
- JS常用的设计模式(9)——策略模式
- 浅学设计模式之策略<Strategy>模式及在android中的使用
- 设计模式(21)-行为型-策略模式(Strategy)
- 设计模式之策略模式
- java设计模式——策略模式(Strategy Pattern)
- 设计模式(4)策略模式
- 设计模式---策略模式
- 设计模式之-策略模式
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式培训之四:策略模式