策略模式是一种定义一系列算法的方法,从概念上来说所有这些算法完成的都是相同的工作,只是具体的实现不同,它可以以相同的方法调用所有算法,减少了各种具体算法类与算法使用类之间的耦合。策略模式的另一个优点就是简化了单元测试,因为每个具体算法都有自己的类,可以通过自己的接口进行单元测试。
策略模式就是用来封装不同的算法的,但在实践中,可以用它封装几乎任何类型的规则,只要在不同时间应用不同的业务规则,就可以考虑使用策略模式。
抽象出的付费接口
package DesignPattern.StrategyPattern;
public interface CashSuper {
public double acceptCash(double money);
}
具体的营销收费策略
package DesignPattern.StrategyPattern;
public class CashNormal implements CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
package DesignPattern.StrategyPattern;
public class CashRebate implements CashSuper {
private double moneyRebate;
public CashRebate(){
moneyRebate=0.8;
}
public CashRebate(String rebate){
this.moneyRebate=Double.valueOf(rebate);
}
@Override
public double acceptCash(double money) {
return this.moneyRebate*money;
}
}
package DesignPattern.StrategyPattern;
public class CashReturn implements CashSuper{
private double moneyCondition;
private double moneyReturn;
public CashReturn(String moneyCondition,String moneyReturn){
this.moneyCondition=Double.valueOf(moneyCondition);
this.moneyReturn=Double.valueOf(moneyReturn);
}
@Override
public double acceptCash(double money) { //满300返还100 500-500/300*100
double res=money;
if(money>=moneyCondition)
res=money-Math.floor(money/moneyCondition)*moneyReturn;
return res;
}
}
决策上下文类
package DesignPattern.StrategyPattern;
public class CashContext {
private CashSuper cs;
public CashContext(CashSuper csuper) {
this.cs = csuper;
}
public CashContext(String type) {
switch (type) {
case "正常收费":
CashNormal cs0 = new CashNormal();
cs = cs0;
break;
case "满300返100":
cs = new CashReturn("300","100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
客户端
package DesignPattern.StrategyPattern;
public class Client {
public static void main(String[] args){
CashContext cs=new CashContext("满300返100");
System.out.println(cs.getResult(500));
}
}