美文网首页
责任链模式和工厂模式的融合使用 DEMO

责任链模式和工厂模式的融合使用 DEMO

作者: 极客123 | 来源:发表于2018-09-18 20:53 被阅读0次

    责任链模式

    将职责逐级划分,层层分离,目的,将耦合的代码解耦,从而提升程序的扩展性,从内存角度出发,节约不必要的开支,提升性能.

    责任链模式关键在于,在处理请求的接口处会有一个标记方法,也就是该类自身,进行回调赋值.

    如图:

    对应该图中,用户发出请求后,服务器接收,对于用户,仅仅知道是将信息发送给了处理中心,而具体谁处理则不需要知道, 用抽象掩盖实体, 提高扩展能力. 自身引用等同于链表结构中的后继

    package com.cctv.play;
    
    public abstract class XxxHandler {
    
        /**
         * 自身引用 : 后继
         */
        protected XxxHandler handler ;
    
        /**
         * 提供给相应的子类去调用,指定对应的处理器
         * @param handler
         */
        public void setHandler(XxxHandler handler) {
            this.handler = handler;
        }
    
        /**
         * 提供抽象方法,对于特定的请求需要具体的子类去实现
         * @param str  处理的请求参数
         */
        public  abstract  void  execute(String  str);
    }
    
    

    各个子类具体实现自身职责

    第一个子类实现(伪代码)...
    package com.cctv.play;
    
    public class XxxOne extends XxxHandler {
        @Override
        public void execute(String str) {
            if ("职责判断"){
                System.out.println("做好本职工作...");
            }else{
                /**
                 * 交给后继处理
                 */
                handler.execute(str);
            }
        }
    }
    
    
    第二个子类实现(伪代码)...
    package com.cctv.play;
    
    public class XxxTwo extends XxxHandler {
        @Override
        public void execute(String str) {
            if ("职责判断"){
                System.out.println("做好本职工作...");
            }else{
                /**
                 * 交给后继处理
                 */
                handler.execute(str);
            }
        }
    }
    
    
    第 N 个子类实现(伪代码)...
    package com.cctv.play;
    
    public class XxxXxx extends XxxHandler {
        @Override
        public void execute(String str) {
            if ("职责判断"){
                System.out.println("做好本职工作...");
            }else{
                /**
                 * 交给后继处理
                 */
                System.out.println("最高权限进行全部处理");
            }
        }
    }
    
    

    可以发现, 其上重写的方法均为父类中规定的方法,即职责


    配置请求客户端类

    package com.cctv.play;
    
    public class ReqCient {
    
        /**
         *   消息发送给的目标,这里选用抽象,提高扩展性
         */
        private XxxHandler handler ;
    
        /**
         * 配置客户的处理器
         * @param handler
         */
        public void setHandler(XxxHandler handler) {
            this.handler = handler;
        }
    
        public void reqExecute(String str){
            handler.execute(str);
        }
    }
    
    

    配置工厂,在工厂中完成责任链的层级关系和生产流程

    package com.cctv.play;
    
    public class HandlerFactory {
    
        public static XxxHandler createHandler(){
            /**
             * 静态的方法,工厂会初始化好整条职责连的成员
             */
            XxxHandler one = new XxxOne();
            XxxHandler two = new XxxTwo();
            XxxHandler xxx = new XxxXxx();
    
            /**
             * 将责任链连起来
             */
            one.setHandler(two);
            two.setHandler(xxx);
            return one;
        }
    }
    

    测试 :组装整个职责连

    package com.cctv.play;
    //该类为组装类,类似Web项目中的Controller
    public class Test {
        public static void main(String[] args) {
            //构建请求
            reqClient client = new reqClient();
            //配置处理中心
            client.setHandler(HandlerFactory.createHandler());
            //发出请求....
            client.reqExecute( 请求参数集合... );
        }
    }
    
    

    无论前端还是后端,都和责任链接触良多,jdk的异常处理,过滤器链,目前火热的框架 Spring,doubbo,早起的java团队开发的AWT(被观察者模式取代),
    前端的js事件模型等等.不定期更新.

    全手打,有不对的地方欢迎留言.

    当然这个模式从宏观角度来看属于模板模式

    相关文章

      网友评论

          本文标题:责任链模式和工厂模式的融合使用 DEMO

          本文链接:https://www.haomeiwen.com/subject/wramnftx.html