策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
第一步:创建抽象策略角色
//现金收费抽象类
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
第二步:创建具体策略角色
//正常收费子类
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
//打折收费子类
public class CashRebate extends CashSuper {
private double moneyRebate = 1d;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
//返利收费子类
public class CashReturn extends CashSuper {
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
double result = money;
if(money >= moneyCondition)
result = money - Math.floor(money / moneyCondition) * moneyReturn;
return result;
}
}
第三步:一个策略类的引用,最终给客户端调用
public class CashContext {
private CashSuper cs;
public CashContext(String type) {
switch(type){
case "正常收费":
cs = new CashNormal();
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);
}
}
第四步:编写测试类
public static void main(String[] args) {
CashContext cs = new CashContext("正常收费");
double price = cs.getResult(500);
System.out.println(price);
CashContext context = new CashContext("满300返100");
double returnPrice = context.getResult(600);
System.out.println(returnPrice);
}