当前位置:编程学习 > JAVA >>

设计模式之我见--2 策略模式

本文所写都是自己的理解,可能会有错误,如果有错误请指出。

我们都看见过商场的促销,促销的方法可谓是五花八门,并且还不断出现新的促销方式,如果我们用一个程序来帮助商场计算促销后应该收的钱数,对于刚学编程的人可能就会用很多的switch。。。case或者if。。。else if。。。else。。。语句将商场的所有促销手段列到一个程序里,这个本没错,但是修改性扩展性比较差。学的好一点的可能会用简单工厂方法,但是也有一个弊端,对于简单工厂来说,它的思想是返回对应的对象,这里一般都是与现实事物对应。但是我们在这里的促销方式更像是一种方法,使用简单工厂虽然可以说的过去,但是总感觉有些别扭,另外如果商场变化促销方式,工厂类和对应促销方式都得修改。既然说了这些促销方式更像方法,那使用策略模式更加适合。

策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响使用算法的客户。

下面看一下类图


首先定义CashSuper,作为一个父类,然后分别有三个类继承了这个类,在三个继承类中定义不同的策略。

下面看一下代码:

[java] 
package Cash; 
 
abstract class CashSuper { 
    public abstract double acceptCash(double money);  

[java] 
package Cash; 
 
public class CashNormal extends CashSuper { 
 
    public double acceptCash(double money) { 
        return money; 
    } 

[java] 
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; 
    } 

[java]
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; 
    } 

[java]
package Cash; 
class CashContext { 
    private CashSuper cs; 
    public CashContext(CashSuper csuper){ 
        this.cs = csuper; 
    }    
    public double GetResult(double money){ 
        return cs.acceptCash(money); 
    } 

最后的是主程序:

[java] 
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()); 
        } 
    } 

策略模式更加侧重的是算法的变化,而简单工厂模式则侧重的是具体对象的变化,把握这两点的不同就可以进行区分了。另外这两个方法一般情况下是可以结合使用的,将策略的返回放入到简单工厂类中。
作者:mengxiangyue

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,