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

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

我们都看见过商场的促销,促销的方法可谓是五花八门,并且还不断出现新的促销方式,如果我们用一个程序来帮助商场计算促销后应该收的钱数,对于刚学编程的人可能就会用很多的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());
		}
	}
}

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值