维基百科:
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式:
- 定义了一族算法(业务规则);
- 封装了每个算法;
- 这族的算法可互换代替(interchangeable)。
定义统一策略接口
public interface CashSuper {
double acceptCash(double money);
}
具体算法1
public class CashNormal implements CashSuper{
@Override
public double acceptCash(double money) {
return money;
}
}
具体算法2
public class CashRebate implements CashSuper{
private double moneyRebate = 1d;
public CashRebate(String moneyRebate) {
this.moneyRebate = Double.parseDouble(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
具体算法3
public class CashReturn implements CashSuper{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(String moneyCondition, String moneyReturn) { //满moneyCondition - moneyReturn
this.moneyCondition = Double.parseDouble(moneyCondition);
this.moneyReturn = Double.parseDouble(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 cashSuper;
public double GetResult(double money) {
return cashSuper.acceptCash(money);
}
public CashContext(String type) {
switch (type) {
case "正常收费" :
cashSuper = new CashNormal();
break;
case "八折" :
cashSuper = new CashRebate("0.8");
break;
case "满300减100" :
cashSuper = new CashReturn("300", "100");
break;
default:
cashSuper = new CashNormal();
break;
}
}
}
客户端代码
public class Main {
public static void main(String[] args) {
CashContext cashContext = new CashContext("八折");
double result = cashContext.GetResult(80);
System.out.println(result);
}
}