美文网首页
(十五)策略模式

(十五)策略模式

作者: feiry | 来源:发表于2019-08-25 23:02 被阅读0次

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


    优惠策略

    策略模式

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


    策略模式
    public abstract class ShoppingCart {
        private Discount discount;
        private List<Fruit> products = new ArrayList<>();
    
        public ShoppingCart(List<Fruit> 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<String,Discount> 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<Fruit> 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思想

    总结

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

    相关文章

      网友评论

          本文标题:(十五)策略模式

          本文链接:https://www.haomeiwen.com/subject/xopsjctx.html