(十五)策略模式

水果要搞优惠活动,但是优惠活动有很多,同样的不影响主流程的情况下,可以选择不同的优惠策略来计算最终的消费金额


(十五)策略模式_第1张图片
优惠策略

策略模式

需要定义好统一的功能入口,注入不同的实现类来实现不同的优惠功能


(十五)策略模式_第2张图片
策略模式
public abstract class ShoppingCart {
    private Discount discount;
    private List products = new ArrayList<>();

    public ShoppingCart(List products){
        this.products = products;
    }

    public void setDiscount(Discount discount) {
        this.discount = discount;
    }

    //提交订单主流程
    public void submitOrder(){
        //计算商品金额
        int money = balance();
        System.out.println("商品总金额为:"+money+"元");

        //优惠减免
        money = discount.calculate(money);
        System.out.println("优惠减免后:"+ money+"元,");

        //保存订单
        pay(money);

        //送货上门
        sendHome();

    }

    //计算金额
    private int balance(){
        int money = 0;
        System.out.print("商品清单:");
        for (Fruit fruit : products){
            fruit.draw();
            System.out.print(",");
            money += fruit.price();
        }
        return money;
    }

    private void sendHome(){
        System.out.println("三公里以内,免费送货上门");
    }

    //提交保存
    protected abstract void pay(int money);

}

public interface Discount {
    public int calculate(int money);
}

定义Discount 接口,实现其计算金额的方法

public class FullDiscount implements Discount {
    @Override
    public int calculate(int money) {
        if (money > 200){
            System.out.println("优惠减免20元");
            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();
    }
}

注入具体的实现类,最后调用接口方法即可

/**
 * 模板方法模式
 * 订单费用结算过程
 */
public class ShoppingCartClient {

    private static Map disCounts = new HashMap();
    static {
        disCounts.put("full",new FullDiscount());
        disCounts.put("newer",new NewerDiscount());
        disCounts.put("second",new SecondDiscount());
    }

    public static void main(String[] args) {
        List products = new ArrayList();

        products.add(StaticFactory.getFruitApple());
        products.add(StaticFactory.getFruitBanana());
        products.add(StaticFactory.getFruitOrange());

        ShoppingCart cart = new OtherPayShopping(products);

        //注入优惠方案
        String discount = "second";
        cart.setDiscount(disCounts.get(discount));
        cart.submitOrder();
    }
}

其核心思想就是注入不同的实现类,来实现不同功能,既不需要修改主流程,也可以随意扩展(开闭原则),这其实就是spring的IOC思想

总结

  • 定一个功能接口,通过注入的方式,来实现不同的功能
  • 适用于需要使用不同的策略来实现功能的场景

你可能感兴趣的:((十五)策略模式)