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

2018-09-18  本文已影响0人  极客123

责任链模式

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

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

如图:

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

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事件模型等等.不定期更新.

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

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

上一篇下一篇

猜你喜欢

热点阅读