java设计模式之混合使用策略模式+工厂模式+模板模式解决实际问题,看一遍就会!!
/记得交给我Spring去管理 @Component public class AHandle extends AbstractHandler {//不用实现eat方法,因为模板已经帮我们实现了 //放入我们的工厂 @Override public void afterPropertiesSet() throws Exception {} }//记得交给我Spring去管理 @Component
·
场景描述
这几种模式在大量项目源码中随处可见!学会并使用,你的代码将得到质的飞跃!
工作时候需要处理多个不同的流程,而不同的流程走不同的处理逻辑,使用大量的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的优势,代码优化如下)
更多推荐
已为社区贡献3条内容
所有评论(0)