以网上购物一下单为例子,网店很多时候为促销,往往会推出一些优惠活动,如满200减100、首次购头20等。
面对这种需求,可通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。
- 将每一种优惠策略,单独成一个组件对象,独立出来
- 使用方通过选择不同的组件,达到不同的行为
PS: 此模式其实就是spring IOC思想
//建立优惠类接口
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("满200减100");
}
return money;
}
}
public class NewerDiscount implements Discount {
@Override
public int calculate(int money) {
return money - 20;
}
}
public class SecondDiscount implements Discount {
@Override
public int calculate(int money) {
return money;
}
}
//在购物车中注入优惠类
public abstract class ShoppingCart {
private Discount discount; //注入
private List<Object> products; //商品列表
public ShoppingCart(List<Object> products) {
this.products = products;
}
public void setDiscount(Discount discount) {
this.discount = discount;
}
/**
* 提交订单
*/
public void submitOrder() {
//计算金额
int money = balance();
//支付
pay(money);
//发货
send();
}
//计算金额
private int balance() {
return discount.calculate(100);
}
//发货
private void send() {
System.out.println("顺丰包邮");
}
//支付方式
protected abstract void pay(int money);
}
public class CashShopping extends ShoppingCart {
public CashShopping(List<Object> products) {
super(products);
}
@Override
protected void pay(int money) {
System.out.println("现金支付");
}
}
//策略模式测试
public class ShoppingCartClient {
public static void main(String[] args) {
//添加商品进购物车
ArrayList<Object> list = new ArrayList<>();
//使用现金进行结算
CashShopping cashShopping = new CashShopping(list);
cashShopping.setDiscount(new NewerDiscount()); //注入优惠类
cashShopping.submitOrder();
}
}