• 设计模式课程 设计模式精讲 19-2 策略模式coding


    1    代码演练

    1.1  代码演练1(多态)

    1.2  代码演练2(优化应用)

    1.3  代码演练3(策略模式结合工厂模式)

    1    代码演练

    1.1  代码演练1(多态)

    需求:

    木木网卖课程,为了促进销售,618实行买课程立减10元,双十一实行满50减10元,还有返现的优惠(这个活动还没有开始)。请实现它

    uml类图:

    测试类:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class TestStrategy {
        public static void main(String [] args){
            PromotionActivity promotionActivityLJ = new PromotionActivity(new LiJianPromotionStrategy());
            PromotionActivity promotionActivityMJ = new PromotionActivity(new ManJianPromotionStrategy());
    
            promotionActivityLJ.execute();
            promotionActivityMJ.execute();
        }
    }

    应用层:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class PromotionActivity {
        private PromotionStrategy promotionStrategy;
        public PromotionActivity(PromotionStrategy promotionStrategy) {
            this.promotionStrategy = promotionStrategy;
        }
    
        public void execute(){
            promotionStrategy.doPromotion();
        }
    }

    实现类1:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class LiJianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("立减10元");
        }
    }

    实现类2:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class ManJianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("满50元减10元");
        }
    }

    实现类3:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class FanXianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("返现10元到木木网");
        }
    }

    接口:

    package com.geely.design.pattern.behavioral.strategy;
    
    /**
     * 初始接口
     */
    public interface PromotionStrategy {
        void doPromotion();
    }

    打印日志:

    立减10元
    满50元减10元
    
    Process finished with exit code 0

    1.2  代码演练2(优化应用类)

    测试类优化:

    package com.geely.design.pattern.behavioral.strategy;
    
    import org.apache.commons.lang.StringUtils;
    
    public class TestStrategy {
    
        public static void main(String [] args){
            PromotionActivity promotionActivity = null;
            String promotionKey = "ManJian";
    
            if(StringUtils.equals(promotionKey,"LiJian")){
                promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
            }else if(StringUtils.equals(promotionKey,"ManJian")){
                promotionActivity = new PromotionActivity(new ManJianPromotionStrategy());
            }
            promotionActivity.execute();
        }
    }

    1.3  代码演练3(策略模式结合工厂模式)

    目的:

    a  将参数设置成可以配置的,简化以后维护的成本

    b  取消大量的if...else...应用

    测试类:

    package com.geely.design.pattern.behavioral.strategy;
    
    import org.apache.commons.lang.StringUtils;
    
    /**
     * add by ddwei 20200213
     */
    public class TestStrategy {
        //demo 1  常规多态实现
       /* public static void main(String [] args){
            PromotionActivity promotionActivity618 = new PromotionActivity(new FanXianPromotionStrategy());
            PromotionActivity promotionActivity1111 = new PromotionActivity(new LiJianPromotionStrategy());
            promotionActivity1111.executePromotion();
            promotionActivity618.executePromotion();
        }*/
    
    
        //demo 2  正常程序不可避免 的使用if else
        /*public static void main(String [] args){
            String promotionStrategy = "LIJIAN";
            PromotionActivity promotionActivity = null;
            if(StringUtils.equals(promotionStrategy,"LIJIAN")){
                promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
            }else if(StringUtils.equals(promotionStrategy,"FANXIAN")){
                promotionActivity = new PromotionActivity(new FanXianPromotionStrategy());
            } //...
            promotionActivity.executePromotion();
        }*/
    
    
        //demo 3  结合工厂模式 ,策略模式推进 ,不再使用if else
        public static void main(String [] args){
            //String promotionStrategy = "LIJIAN";
            //String promotionStrategy = "FANXIAN";
            String promotionStrategy = "LIJIAN3";
            PromotionStrategy iPromotionStrategy = PromotionFactory.getPromotionStrategy(promotionStrategy);
            PromotionActivity promotionActivity = new PromotionActivity(iPromotionStrategy);
            promotionActivity.executePromotion();
        }
    
    }

    核心类(策略模式结合工厂模式):

    package com.geely.design.pattern.behavioral.strategy;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 策略工厂
     */
    public class PromotionFactory {
    
        private static Map<String,PromotionStrategy> promotionStrategyHashMap= new HashMap<String, PromotionStrategy>();
        //静态代码块 HashMap放值
        static{
            promotionStrategyHashMap.put(IPromotionConfigtation.MANJIAN,new ManJianPromotionStrategy());
            promotionStrategyHashMap.put(IPromotionConfigtation.LIJIAN,new LiJianPromotionStrategy());
            promotionStrategyHashMap.put(IPromotionConfigtation.FANXIAN,new FanXianPromotionStrategy());
        }
    
        /**
         * 主方法
         * 根据传入的策略key值 查询到相应的策略.
         * 如果未查到相应的key值返回空策略,目的是避免出现空指针异常的情况
         * 从根本上代替了if...else 的功能
         * @param promotionKey
         * @return
         */
        public static PromotionStrategy getPromotionStrategy(String promotionKey){
            PromotionStrategy EMPTYPROMOTIONSTRATEGY = new EmptyPromotionStrategy();
            return promotionStrategyHashMap.containsKey(promotionKey)?promotionStrategyHashMap.get(promotionKey):EMPTYPROMOTIONSTRATEGY;
        }
    
        /**
         * 后期维护入口:
         * 内部类,放入配置参数
         */
        interface IPromotionConfigtation{
            String MANJIAN = "MANJIAN";
            String LIJIAN = "LIJIAN";
            String FANXIAN = "FANXIAN";
        }
    
    
        //禁止外部调用构造函数来创建对象
        public PromotionFactory() {
        }
    }

    促销活动类:

    package com.geely.design.pattern.behavioral.strategy;
    
    /**
     * 促销应用类
     * add by ddwei 20200213
     */
    public class PromotionActivity {
        //有参构造传值
        private PromotionStrategy promotionStrategy;
    
        public PromotionActivity(PromotionStrategy promotionStrategy) {
            this.promotionStrategy = promotionStrategy;
        }
    
        //调用执行策略方法
        public void executePromotion(){
            promotionStrategy.doPromotion();
        }
    
    }

    子类空策略类:

    package com.geely.design.pattern.behavioral.strategy;
    
    /**
     * 空策略
     */
    public class EmptyPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("todo 无相应的优惠!");
        }
    }

    子类满减类:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class ManJianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("todo 实现满减逻辑");
        }
    }

    子类立减类:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class LiJianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("todo 实现立减逻辑");
        }
    }

    子类返现类:

    package com.geely.design.pattern.behavioral.strategy;
    
    public class FanXianPromotionStrategy implements PromotionStrategy {
        @Override
        public void doPromotion() {
            System.out.println("todo 实现返现逻辑");
        }
    }

    父类策略接口:

    package com.geely.design.pattern.behavioral.strategy;
    
    /**
     * 促销通用接口
     * add by ddwei 20200213
     */
    public interface PromotionStrategy {
        void doPromotion();
    }

    打印结果:

    todo 无相应的优惠!
    
    Process finished with exit code 0
  • 相关阅读:
    正则表达式,re模块
    序列化(pickle,shelve,json,configparser)
    unity 模型 材质 贴图 关系;着色器属性
    Unity 控制public/private 是否暴露给Inspector面板
    Unity局部坐标系与世界坐标系的区别
    Unity脚本中可以引用的类型
    Unity 脚本挂载位置
    Unity 获取坐标函数 坐标转换函数
    Unity 烘焙的2种方式
    Unity官方宣传片Adam 播放地址
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/11639220.html
Copyright © 2020-2023  润新知