初探策略模式

记得最早一次接触策略模式是在一篇微信公众号的文章中,当时只是看了看文章的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();
    }
}
原文地址:https://www.cnblogs.com/wxdmw/p/13720417.html