责任链设计模式详解

1、需要一个抽象类

public abstract class AbstractBizHandler {/*
      直接后继,用于传递请求
*/
    protected AbstractBizHandler abstractBizHandler;    public void setSuccessor(AbstractBizHandler abstractBizHandler) {        this.abstractBizHandler = abstractBizHandler;
    }/*
     * 处理具体业务
     */
    public abstract void doRealBusiness(String biz, Map bizParams);
}

2.创建一个工厂,在spring工程中一定要注入建立,不用new,因为后期还有很多方法依赖于springm,new出来的无法注入具体实现类中的bean

Componentpublic class AbstractBizHandlerFactory {    /*
     * 创建工厂方法
     */
    @Autowired
    TxxxHandler txxxandler;    @Autowired
    TxxxHandler2 txxxandler2;    public  AbstractBizHandler createHandler() {
        txxxandler.setSuccessor(txxxandler2);        return txxxandler;
    }
}

3.具体handler

@Componentpublic class TxxxHandler extends AbstractBizHandler {    @Override
    public void doRealBusiness(String str, Map map) {        if ("txxx".equals(biz)) {
          
        } else {
            abstractBizHandler.doRealBusiness(str, map);
        }

4、在实现类中引用

AbstractBizHandler handler = abstractBizHandlerFactory.createHandler();
            handler.doRealBusiness(str, map);

这样一个责任链就实现好了
这样有个不好处就是没次新增需要修改工厂,有种方式是用抽象工厂代替现在的工厂,但是这样就太复杂了
下面的方法可以只要新增一个实现类就可以
1、
将抽象类改为这样

@Componentpublic abstract class AbstractBizHandler {  
    public abstract String getBiz();   
    public abstract void doRealBusiness( Map bizParams);
}

实现类改为这样

@Componentpublic class TxxxHandler extends AbstractBizHandler {    @Override
    public String getBiz() {        return xxx;
    }    @Override
    public void doRealBusiness(Map map) {
       
    }
}
@Componentpublic class AbstractBizHandlerFactory implements InitializingBean {    @Autowired
    private List<AbstractBizHandler> handlers;    @Autowired
    private Map<String, AbstractBizHandler> map;    public void getRealHandler2(String str, Map map1) {
        map.get(biz).doRealBusiness(map1);
    }    @Override
    public void afterPropertiesSet() throws Exception {
        handlers.stream().forEach(handler -> {
            map.put(handler.getBiz(), handler);
        });
    }
}

调用方直接调用getRealHandler2就行了
还有一种是这样

*/@Componentpublic abstract class AbstractBizHandler {    public abstract boolean support(String str);    
    public abstract void doRealBusiness( Map map);
}
*/@Componentpublic abstract class AbstractBizHandler { 
    public abstract boolean support(String str);    
    public abstract void doRealBusiness( Map map);
}
@Componentpublic class AbstractBizHandlerFactory {    @Autowired
    private List<AbstractBizHandler> handlers;    public void getRealHandler(String str, Map map1) {        for (AbstractBizHandler handler : handlers) {            if (handler.support(str)) {                handler.doRealBusiness(map1);                break;
            }
        }
    }

factory还有一种办法是这样

private static List<Class<? extends AbstractBizHandler>> abstractBizHandlerList= Lists.newArrayList();
    @Autowired    private static Map<String, Class<? extends AbstractBizHandler>> abstractBizHandlerMap = Maps.newHashMap()
   public void getRealHandler(String biz,Map bizParams) throws IllegalAccessException, InstantiationException {
        AbstractBizHandler abstractBizHandler = abstractBizHandlerMap.get(biz).newInstance();
        abstractBizHandler.doRealBusiness(bizParams);
    }
    static {        //获取该路径下所有类
        Reflections reflections = new Reflections("com");        //获取继承了IAnimal的所有类
        Set<Class<? extends AbstractBizHandler>> classSet = reflections.getSubTypesOf(AbstractBizHandler.class);
        abstractBizHandlerList.addAll(classSet);
    }
    @PostConstruct
    public void init() throws IllegalAccessException, InstantiationException {        for (Class<? extends AbstractBizHandler> clazz : abstractBizHandlerList){
            AbstractBizHandler obj = clazz.newInstance();
            abstractBizHandlerMap.put(obj.getBiz(), clazz);
        }
    }


感谢:https://my.oschina.net/pengyan5945/blog/593634

Java获取所有子类、实现类-CSDN博客

如何获取某个类的所有子类_获取抽象类所有子类-CSDN博客

Java模式之责任链模式_责任链 java-CSDN博客

责任链模式(Chain of Responsibility) Java实现-CSDN博客


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容