zoukankan      html  css  js  c++  java
  • 初探策略模式

    记得最早一次接触策略模式是在一篇微信公众号的文章中,当时只是看了看文章的demo,没有太深刻的理解,所以很快就忘记了,只记得这东西可以干掉大量的if else,听着还挺不错的。

    今天看书的时候,恰好看到讲解策略模式的部分,索性就重学一下。由于这东西于我而言着实比较陌生,看过一遍之后,总觉得理解的不太深刻,不知道以后在适当的场景中能不能用出来,甚至能不能想得到去应用。在此先将我自己肤浅的理解记录一下,以免以后忘记。

    在此就不记录书中所说的定义了,我自己对它的理解就是将许多可相互替换的代码封装起来,在适当的时候可以动态切换。这些代码就是所谓的策略,也就是解决问题的方式。

    那如何让他们相互替换呢?这个时候就可以用到多态了,所以我们需要先有一个接口(以下命名随便起的)。

    public interface DoSomething {
        public void doThing();
    }

    做点事情,做什么事情?不知道,不确定,不同的策略做不同的事情。

    public class BuildProject implements DoSomething {
        @Override
        public void doThing() {
            System.out.println("BuildProject");
        }
    }
    public class LearnTech implements DoSomething {
        @Override
        public void doThing() {
            System.out.println("LearnTech");
        }
    }
    public class PracticeCode implements DoSomething {
        @Override
        public void doThing() {
            System.out.println("PracticeCode");
        }
    }

    这是三个策略,每个策略的实例对象都可以赋给接口的声明,这样只需要一个声明就可以动态的切换不同的策略!

    关键问题是我们要怎样切换?如果用if else的话,当判断变得复杂起来,就比较难搞(突然想起了代码中的三角结构)

        if () {
                if () {
                    if () {
                        
                    }
                }
            }

    所以书中给出的策略是采用容器式单例、工厂模式来进行代码优化,就是将所有策略事先存进一个容器里,然后可以随时取出来。

    public class ContainerFactory {
    
        private static Map<String, DoSomething> map = new HashMap<>();
    
        static {
            map.put("pro", new BuildProject());
            map.put("tec", new LearnTech());
            map.put("code", new PracticeCode());
        }
    
        public static DoSomething getService(String key) {
            if (!map.containsKey(key))
                throw new RuntimeException("unknown");
            return map.get(key);
        }
    }

    测试方法:

    public class Start {
        public static void main(String[] args) {
            ContainerFactory.getService("pro").doThing();
        }
    }
  • 相关阅读:
    webMagic学习笔记 主页
    maven 听视频笔记
    idea如何做到多模块开发项目 收藏整理
    JAVA 增删改查接口命名规范(dao层与 service 层
    mybatis 自学笔记
    nginx学习主页导航
    用 async/await 来处理异步
    若依:SysUserMapper.xml 分析
    idea 创建多模块项目子模块为灰色
    Maven多模块开发遇到的错误 -- Maven的子模块变成灰色
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13720417.html
Copyright © 2011-2022 走看看