本文所写都是自己的理解,可能会有错误,如果有错误请指出。
我们都看见过商场的促销,促销的方法可谓是五花八门,并且还不断出现新的促销方式,如果我们用一个程序来帮助商场计算促销后应该收的钱数,对于刚学编程的人可能就会用很多的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());
}
}
}
策略模式更加侧重的是算法的变化,而简单工厂模式则侧重的是具体对象的变化,把握这两点的不同就可以进行区分了。另外这两个方法一般情况下是可以结合使用的,将策略的返回放入到简单工厂类中。