紧接着上面的模板方法设计模式,当用户支付时,其实用户是有优惠活动可以享受的,但是每个用户的具体情况不同,所选择的优惠活动是不一样的,有满减活动、首次购活动、新会员活动,等等一系列优惠。
为了避免一系列的if ... else的书写,我们使用策略模式进行优化:
首先是打折的抽象接口:
public interface Discount {
public int calculate(int money);
}
下面是四种不同的打折策略:
/**
* 满减
*/
public class FullDiscount implements Discount {
@Override
public int calculate(int money) {
if (money > 200){
System.out.println("优惠减免20元");
return money - 20;
}
return money;
}
}
/**
* 假日全免
*/
public class HolidayDiscount implements Discount {
@Override
public int calculate(int money) {
if (money > 100){
return money - 20;
}
return money;
}
}
/**
* 首次购
*/
public class NewerDiscount implements Discount {
@Override
public int calculate(int money) {
if (money > 100){
return money - 20;
}
return money;
}
}
/**
* 第二单9折优惠
*/
public class SecondDiscount implements Discount {
@Override
public int calculate(int money) {
Double balance = money * 0.9;
return balance.intValue();
}
}
在使用时,只需要将这个折扣对象传入即可:
ShoppingCart cart = new OnlineShopping(products);
//注入优惠方案
String discount = "second";
cart.setDiscount(disCounts.get(discount));
最终调用的是discount的实现类,完成各个策略的最终选择。