场景描述

  这几种模式在大量项目源码中随处可见!学会并使用,你的代码将得到质的飞跃!
  工作时候需要处理多个不同的流程,而不同的流程走不同的处理逻辑,使用大量的if,else难以阅读和扩展。
   废话不多说直接开始上手改造。改造前伪代码:

public void handle(Strign processKey){
	if(processKey.equals("A")){
		//中间存在很多需要单独处理的逻辑
		 System.out.println("A吃了饭");
	}else if(processKey.equals("B")){
		//中间存在很多需要单独处理的逻辑
		System.out.println("B吃了饭");
	}else if(processKey.equals("C")){
		//中间存在很多需要单独处理的逻辑
		System.out.println("C只干活不吃饭");
	}
}

   这个代码中有很多处理逻辑,而且等于C时候执行的方法与前面的不同。假设后续还要继续增加许多processKey,如果继续在此方法中使用if,else那么问题就非常大。代码变得难以阅读,整个方法代码行数将成倍数增长。对此我们需要进行改造。

第一步创建我们的模板方法
//需要必须实现 InitializingBean 我想你不会问我这是什么吧
 public abstract class AbstractHandler implements InitializingBean {
 
	//A和B处理方式都是一样,我就可以直接在该方法中实现具体操作。当然你也可以不实现,让其子类实现该方法
	//但是如果几乎很多类处理方式都是一样,那么为了避免代码冗余就直接这样写就好了。
	public void eat(String name){
		System.out.println(name + "吃了饭");
	}
	
	//C要用的方法?
	public void work(String name){
		//直接实现是不是不太好?对的因为其他类中可能不需要这个方法,只有C特殊
		//System.out.println(name+ "只干活不吃饭");
		//所以我们在该方法中直接抛出异常,防止不需要该类的方法调用此方法
		 throw new UnsupportedOperationException();
	}

}
第二步 创建我们的工厂 (当然你可以直接CP到你的代码中去)
	public class MyFactory {

	    private static Map<String, AbstractHandler> strategyMap = Maps.newHashMap();
	
	    public static AbstractHandler getInvokeStrategy(String key){
	        return strategyMap.get(key);
	    }
	
	    public static void register(String key, AbstractHandler handler){
	        if(StringUtils.isEmpty(key) || ObjectUtils.isEmpty(handler)){
	            return;
	        }
	        strategyMap.put(key, handler);
	    }

}
第三步 创建不同的处理类去继承我的AbstractHandler
	//记得交给我Spring去管理
	@Component
	public class AHandle extends AbstractHandler{
			//不用实现eat方法,因为模板已经帮我们实现了
			//放入我们的工厂
		    @Override
    		public void afterPropertiesSet() throws Exception {
       			MyFactory.register("A", this);
    		}
	}
	//记得交给我Spring去管理
	@Component
	public class BHandle extends AbstractHandler{
			//不用实现eat方法,因为模板已经帮我们实现了
			//放入我们的工厂
		    @Override
    		public void afterPropertiesSet() throws Exception {
       			MyFactory.register("B", this);
    		}
	}
	//记得交给我Spring去管理
	@Component
	public class CHandle extends AbstractHandler{
			//C的执行方法是work 所以我们要怎么办呢?重写对吧。如果你不想单独调用时候判断C然后执行work
			//我们就可以这样尝试
			@Override
			public void eat(String name){
				this.work(name)
			}

			//C要用的方法
			@Override
			public void work(String name){
				System.out.println(name+ "只干活不吃饭");
			}

			//放入我们的工厂
		    @Override
    		public void afterPropertiesSet() throws Exception {
       			MyFactory.register("C", this);
    		}
	}
调用方式发生改变
public void handle(Strign processKey){
	//if(processKey.equals("A")){
		//中间存在很多需要单独处理的逻辑
		// System.out.println("A吃了饭");
	//}else if(processKey.equals("B")){
		//中间存在很多需要单独处理的逻辑
		//System.out.println("B吃了饭");
	//}else if(processKey.equals("C")){
		//中间存在很多需要单独处理的逻辑
		//System.out.println("C只干活不吃饭");
	//}
   AbstractHandler invokeStrategy = MyFactory.getInvokeStrategy(processKey);
   invokeStrategy.eat(processKey);
}

   结尾:以上就是我们需要做的,是不是很简单?如果你还需要追加D,就可以创建一个DHandle。
通过这个实际问题的解决,我想你已经会用了,赶紧实验吧。

2024-1-15修改代码(上面的方式在实际开发中没有能完全展示出Spring的优势,代码优化如下)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐