日常编码中我们经常遇到 很多if else的代码,比如
String name=""; if ("1A".equals(name)){ System.out.println("1111111AAAAAAAAA"); }else if("2B".equals(name)){ System.out.println("222222BBBBBB"); }else if("3C".equals(name)){ System.out.println("33333CCCCCCC"); }
把业务逻辑抽取到handler里面
String name=""; if ("1A".equals(name)){ new HandlerA1().A(name); }else if("2B".equals(name)){ new HandlerB1().A(name); }else if("3C".equals(name)){ new HandlerC1().A(name); }
策略模式只是优化了if else里面的逻辑,并没有把if干掉
下面我们使用工厂模式把if干掉
1.首先先写一个工厂用来生成我们的策略handler
public class Factory { private static Map<String,AbstractHandler> strategyMap = new ConcurrentHashMap<>(); public static void register(String name,AbstractHandler handler){ strategyMap.put(name,handler); } public static Handler getInvokeStrategy(String name){ return strategyMap.get(name); } }
2.我们的所有业务Handler都实现Handler接口
@Component public class HandlerA1 implements Handler{ @Override public void afterPropertiesSet() throws Exception { Factory.register("1A",this); } @Override public void A(String name) { System.out.println("1111111111AAAAAAAAAAAAA"); } @Override public void B(String name) { } @Override public void C(String name) { } }
3.利用Spring的InitializingBean把Handler注册到Factory工厂中
public abstract interface Handler implements InitializingBean { /*** * 用抽象类做模板方法 * @param name */ public void A(String name); public void B(String name); public void C(String name); }
4.时我们的if else就变成
@Override public void A(String name) { System.out.println("1111111111AAAAAAAAAAAAA"); }
上面第二步的HandlerA1实现Handler的时候 需要把Handler接口的所有方法全部实现
但是HanderA1并不需要B和C方法
我们改造Handler接口成一个抽象的Handler
public abstract class AbstractHandler implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { } /*** * 用抽象类做模板方法 * @param name */ public void A(String name) { throw new UnsupportedOperationException(); } public void B(String name) { throw new UnsupportedOperationException(); } public void C(String name) { throw new UnsupportedOperationException(); } }
此时 我们的业务Handler继承AbstractHandler然后还需要实现自己需要的业务方法即可
ClassLoader 调用findClass的过程就使用了模板方法的设计模式
原文:https://www.cnblogs.com/ssskkk/p/13939526.html