记得最早一次接触策略模式是在一篇微信公众号的文章中,当时只是看了看文章的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(); } }