• 责任链模式



    责任链模式


    • 责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
    • 责任链模式的重点在“链”,由抽象类中的方法决定由那个实现类处理该请求,并返回结果,其通用类图如下:

      • 抽象的处理者Handler实现三个职责:一个是定义一个请求的处理方法handleRequest(),唯一对外开放的方法;一个是定义一个链的编排方法setLevel(),即处理请求的先后顺序,还有设置和获取当前类的处理等级;第三个是定义了具体的请求者必须实现的具体处理任务response()。通用类图的源码如下:
      • public class Request {
            //定义当前请求的处理等级
            private int level;
            public Request(){
                this.level = 1; //默认处理等级为1
            }
            public void setLevel(int level){
                this.level = level;
            }
            public int getLevel(){
                return this.level;
            }
        }
        
        public abstract class Handler {
            private Handler nextHandler;
            private int level;
            protected void setNextHanlder(Handler handler){
                this.nextHandler = handler;
            }
            //模板方法,判断请求级别和当前处理的级别
            public final String handlerRequest(Request request){
                if(request.getLevel() == this.level)
                    return response(request);
                else{
                    if(this.nextHandler != null)
                        return this.nextHandler.handlerRequest(request);
                    else
                        return "请求处理失败";
                }
            }
            protected int getLevel(){
                return this.level;
            }
            protected void setLevel(int level){
                this.level = level;
            }
             //抽象处理方法,具体在子类中实现
            protected abstract String response(Request request);
        }
        
        public class ConcreteHandler1 extends Handler{
        
            @Override
            protected String response(Request request) {
                // TODO Auto-generated method stub
                return "第一个处理者处理请求";
            }
        }
        
        public class ConcreteHandler2 extends Handler{
        
            @Override
            protected String response(Request request) {
                // TODO Auto-generated method stub
                return "第二个处理者处理请求";
            }
        }
        
        public class Client {
        
            /**
             * @param args
             */
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                Request request = new Request();
                //request.setLevel(3);
                Handler handler1 = new ConcreteHandler1();
                Handler handler2 = new ConcreteHandler2();
                handler1.setLevel(1);
                handler2.setLevel(2);
                handler1.setNextHanlder(handler2);
                System.out.println(handler1.handlerRequest(request));
            }
        }

    责任链模式的优缺点

    优点:责任链模式的优点是将请求和处理分开,请求者可以不用知道谁去处理,处理者不用知道请求的全貌,两者解耦,提高系统灵活性。

    缺点:性能问题,每个请求都是从链头遍历到链尾,当链较长时,性能会下降;调试不方便,当链较长时,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

    最佳实践

        在类图中Handler是抽象类,融合了模板方法模式,每个实现类只要实现response请求处理方法。通过融合模板方法模式,各个实现类只需要关注自己的业务逻辑,父类决定请求的具体处理类,即父类实现了请求的传递功能,子类实现请求的处理,符合单一职责原则,各个实现类只完成一个动作或逻辑,也就是只有一个原因引起类的变化。

        责任链屏蔽了请求的处理过程,只需把请求抛给责任链的第一个处理者,不需要知道具体谁来处理请求,这是责任链模式的核心,同时责任链也可以作为一种补救措施。当随着请求的增加,可以添加对新增请求的处理类,上层的调用保持不变。如银行开始只提供人民币的服务,当业务增加需要同时支持对欧元和美元请求的处理。其可以采取责任链模式,其通用类图如下:

  • 相关阅读:
    变量与常量
    .面向过程和面向对象的区别
    .JDK,JRE,JVM三者关系
    DEV C++, 利用链表实现目录内所有文件列表显示
    swith的用法和注意事项?
    Java排序(一)实现类的排序
    C++数据结构——树(基础知识篇)
    杀进程
    监控 monitor java 代码
    putty 直接连 快捷键方式
  • 原文地址:https://www.cnblogs.com/zhanglei93/p/6071696.html
Copyright © 2020-2023  润新知