设计模式之策略模式:替换掉糟糕的if else语句实现面向对象编程而非面向过程

场景:

(1):远行时候:我们根据不同的路程来选择不同的远行车类型

(2):如果这个参数1,

那么选择远行车类型A

如果这个参数2,那么选择远行车类型B

如果这个参数3,那么选择远行车类型C

内容

1.不使用设计模式

复制代码
public class NonPattern {
    public static void main(String[] args) {
        /**
         *有一个参数,是distanceType
         * 如果这个参数1,那么选择远行车类型A
         * 如果这个参数2,那么选择远行车类型B
         *     如果这个参数3,那么选择远行车类型C
         */
         int distanceType = 1;
         Trip.choseTransport(distanceType);
    }
  public static class Trip{
     public static void choseTransport(int distanceType)   {
            if (distanceType==1){
                System.out.println("远行车类型A");
            }else if(distanceType == 2){
                System.out.println("远行车类型B");
            }else if(distanceType == 3){
                System.out.println("远行车类型C");
            }else {
                System.out.println("远行车默认类型");
            }
        }
    }
}

2.使用设计模式

策略模式就是:

1.自定义一个策略接口,里面定义一个方法,面向接口编程。

2.根据策略接口 可以定义多个策略,一个策略就是一个if。

3.把各个if-elase逻辑划分到各个策略中(每个策略封装了自己对应的逻辑)---满足什么条件返回什么策略。

4.把if-else 这种选择扔到一个工厂里面去。

5.策略的真正执行我们将其封装到:Context里面去。

2.1 类图
2.2 代码
复制代码
public class StrategyPattern2 {

    public static void main(String[] args) {
       //1.根据参数类型使用工厂模式产生:DistanceChoiceStrategy
        DistanceChoiceStrategy distanceChoiceStrategy = DistanceChoiceStrategyFactory.getDistanceChoiceStrategy(1);


        //2.使用策略执行类执行对应策略
        Context context = new Context();
        context.setStrategy(distanceChoiceStrategy);
        context.excuet();
    }

    //===========================执行类=========================
    public static class Context{
        private DistanceChoiceStrategy strategy;

        public void excuet(){
            strategy.choice();
        }
        public DistanceChoiceStrategy getStrategy() {
            return strategy;
        }

        public void setStrategy(DistanceChoiceStrategy strategy) {
            this.strategy = strategy;
        }
    }

    //=======================工厂模式产生==========
    public static class DistanceChoiceStrategyFactory{
       public static DistanceChoiceStrategy getDistanceChoiceStrategy(int distanceType){
            if (distanceType==1){
               return new DistanceChoiceStrategyA();
            }else if(distanceType == 2){
                return new DistanceChoiceStrategyB();
            }else if(distanceType == 3){
                return new DistanceChoiceStrategyC();
            }else {
              return new DefaultDistanceChoiceStrategy();
            }
        }
    }
    //======================if-else封装==========
    public interface DistanceChoiceStrategy{
        void choice();
    }

    public static class DistanceChoiceStrategyA implements DistanceChoiceStrategy{
        public void choice() {
            System.out.println("远行车类型A");
        }
    }

    public static class DistanceChoiceStrategyB implements DistanceChoiceStrategy{
        public void choice() {
            System.out.println("远行车类型B");
        }
    }

    public static class DistanceChoiceStrategyC implements DistanceChoiceStrategy{
        public void choice() {
            System.out.println("远行车类型C");
        }
    }

    public static class DefaultDistanceChoiceStrategy implements DistanceChoiceStrategy{
        public void choice() {
            System.out.println("远行车默认类型");
        }
    }
}

3.总结

3.1 不使用设计模式
  1. 我们的业务代码,if else,看起来绝对不是这么短的,也不是这么简单;在实际的业务代码中,常见的结构是上面这样的,但是每个if和if else之间的代码行数,可能多达几十行,甚至几百行;if和else if的判断条件,很模糊,经常就是用一堆变量的比较来判断,是走哪个分支。
  2. 类似上面这样的代码,会让我们在代码写好以后,多年之后,回过头来看这个代码;看都看不懂了:代码太多了,if else if之后的条件判断,我们都看不懂,不知道在判断,if else if里面的代码,量太大了;定位个bug,疯了,或者是对这段代码的业务逻辑做一些改动,疯了;基本上,你得花个一两天的时间,把这段代码重新读一遍,然后看懂,才能下手写代码。
3.2 策略模式优点
3.2.1 策略模式就是:

1.自定义一个策略接口,里面定义一个方法。

2.根据策略接口 可以定义多个策略。

3.把各个if-elase逻辑划分到各个策略中(每个策略封装了自己对应的逻辑)---满足什么条件返回什么策略。

4.把if-else 这种选择扔到一个工厂里面去。

5.策略的真正执行我们将其封装到:Context里面去。

3.2.2 要点

1.要点1:必须将if else的代码,封装到不同的策略类中。

2.要点2:将选择哪种策略的逻辑给放到一个工厂类中去,选择策略的代码务必很简洁。

3.要点3:context可有可无,具体是看你的策略执行这块如果就一行代码调用,不需要context;如果context中的策略执行逻辑较为复杂一点,context来封装策略类的执行逻辑。

3.2.3 策略模式与命令模式不同:

策略模式跟命令模式的区别?

  1. 看起来一样的,但是用处不一样。命令是可以发送出去,然后可以经过一些队列的流转,比如先把命令发送到MQ,接着再处理。
  2. 策略是说选择了一组策略,立即就要执行的,不会经过其他别的什么处理。而且策略逻辑基本就是用在复杂的if else代码中的。
相关推荐
妙蛙种子3112 小时前
【Java设计模式 | 创建者模式】工厂方法模式
java·后端·设计模式·工厂方法模式
wwdoffice01104 小时前
薄 膜 干 涉
设计模式
无籽西瓜a7 小时前
【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景
java·后端·设计模式·软件工程·装饰器模式
无籽西瓜a7 小时前
【西瓜带你学设计模式 | 第十三期 - 组合模式】组合模式 —— 树形结构统一处理实现、优缺点与适用场景
java·后端·设计模式·组合模式·软件工程
Rsun0455118 小时前
设计模式应该怎么学
java·开发语言·设计模式
_MyFavorite_20 小时前
JAVA重点基础、进阶知识及易错点总结(31)设计模式基础(单例、工厂)
java·开发语言·设计模式
_MyFavorite_1 天前
JAVA重点基础、进阶知识及易错点总结(32)设计模式(建造者、原型)
java·python·设计模式
妙蛙种子3111 天前
【Java设计模式 | 创建者模式】单例模式
java·开发语言·后端·单例模式·设计模式
武藤一雄2 天前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
he___H2 天前
Spring中的设计模式
java·spring·设计模式