使用场景,实现一个需求,要在多种不同的解决方案中选中一个。如商场打折等促销活动,最终需求只有一个,就是能够知道优惠后,顾客需要付多少钱。
// 环境类与抽象策略类写在一起
public abstract class CommodityCash{
private double money;
setter;
getter;
public abstract double getRealMoney();
}
// 正常,无优惠
public class CashNormal extends CommodityCash{
@Override
public double getRealMoney(){
return getMoney()
}
}
// 打折优惠
public class CashRebate extends CommodityCash{
private double moneyRebate //折扣
public CashRebate(double moneyRebate){
if(money <=0 || money >10){
throw new Exception("折扣不合规")
}
this.moneyRebate = moneyRebate
}
@Override
public double getRealMoney(){
return getMoney() * moneyRebate /10;
}
}
// 客户端
public class Client{
psvm{
CommodityCash cash= new CashRebate(6);
cash.setMoney(1000); // 原价
cash.getReakMoney(); //现价
cash = new CashNormal ();
cash.setMoney(100);
cash.getRealMoney;
}
}
// 若是添加了新的优惠方式(满减)
public class CashReturn extends CommodityCash{
private double minMoney; // 符合满减的小金额
private double returnMoney; // 满减返回的现金
public CashReturn (double minMoney, double returnMoney){
this.minMoney = minMoney;
this.returnMoney = returnMoney;
}
@Override
public double realMoney(){
if(getMoney()>minMoney){
int x = (int)(getMoney() / minMoney);
return money - returnMoney*x;
}else{
return 0;
}
}
}
// 客户端可以直接使用。满足开闭原则
public class Client{
psvm{
CommodityCash cash= new CashRebate(6);
cash.setMoney(1000); // 原价
double money = cash.getReakMoney(); //现价
cash = new CashNormal ();
cash.setMoney(100);
money = cash.getRealMoney;
cash = new CashReturn (300, 50) // 满300减50;
cash.setMoney(600);
money = cash.getRealMoney
}
}