zoukankan      html  css  js  c++  java
  • 责任链模式

    应用情景


      责任链模式主要应用在对请求的处理上。当一个请求来临的时候,A、B、C都有可能去处理,由于A、B、C三者的能力不同,他们会更根据请求中携带的数据进行条件判断,如果满足自己的条件,才可以被自己处理,否则  需要由其他人处理。在这种情况下,我们可以使用if...else来处理请求,先进行条件判断,然后交给某人去处理。当然,更好的实现方式是使用责任链模式。将请求直接交给A,A自己进行条件判断,A如果发现自己处理不了,则将请求交给B,B再进行判断,以此类推。

    类图关系


     

    Handler:抽象类,定义处理方法handleMessage;定义编排方法setNext来设置下一个处理者;定义每个具体的处理者处理级别以及具体处理任务

    concreteHandler:继承抽象类,实现自己的处理任务

    示例代码


    在责任链中前一个对象可以消费(增删改)一部分请求信息后交给下一个对象也是可以的。

    public abstract class Handler{
        private Handler nextHandler;
        
        public final Response handleMessage(Request request){
            Response response = null;
            //判断是否是自己的处理级别
            if(this.getHandleLevel().equals(request.getRequestLevel())){
                response = this.echo(request);
            }else{
                if(this.nextHandler != null)
                    response = nextHandler.handleMessage(request);
                else{
                    //没有适当的处理者,业务自行处理
                }
            }
            return response;
        }
        
        protected void setNext(Handler _handler){
            this.nextHandler = _handler;
        }
        
        protected abstractLevell getHandleLevel();
        
        protected abstract Response echo(Request request);
    }

     具体处理者

    class ConcreteHandler extends Handler{
    
        protected Response echo(Request request){
            //完成处理逻辑
            return null;
        }
        
        //设置自己的处理级别
        protected Level getHandlerLevel(){
            return null;
        }
    }

    模式有关框架的代码

    class Level{
        //定义一个请求处理等级
    }
    
    class Request{
        //请求处理等级
        public Level getRequestLevel(){
            return null;
        }
    }
    
    class Response{
        //处理者返回的数据
    }

    场景类

    class Client{
        public static void main(String[] args) {
            //声明所有的处理节点
        }
        Handler handler1 = new ConcreteHandler();
        Handler handler2 = new ConcreteHandler();
        Handler handler3 = new ConcreteHandler();
        
        //设置链中的阶段程序1->2->3
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        
        //提交请求
        Response response = handler1.handlerMessage(new Request());
    }

    总结


    优点:将请求和处理分开,两者解耦,提高系统的灵活性

    缺点:当链比较长,处理请求时性能就是一个问题,二是调试不是方便

  • 相关阅读:
    下载PDF格式的Html
    EnumHelper.cs
    FtpHelper.cs
    Windows下用cmd命令安装及卸载服务
    c# list排序
    用NOPI将图片二进制流导出到Excel
    jquery的clone方法 于textarea和select的bug修复
    时间戳格式化函数
    快速激活Navicat Premium 12
    防止应用程序重复打开
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5812075.html
Copyright © 2011-2022 走看看