设计模式-行为型- 责任链模式(Chain of Responsibility)

来源:互联网 发布:linux一键安装包kangle 编辑:程序博客网 时间:2024/04/27 19:54

定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止

       if…else进行判断处理非常直观、容易理解,而且很容易维护,但是如果处理的逻辑比较复杂时,就面临着代码臃肿的问题了, 而且代码的耦合度也较高。鉴于这些问题,责任链模式应运而生

角色

抽象处理者(Handler):定义出一个处理请求的接口。包含一个返回下一个处理类的方法和处理请求的方法,处理请求方法的思想是,如果满足条件,则由本处理类来处理,否则就把请求抛给下一个处理类

具体处理者:对抽象处理者进行实现,并加入处理逻辑

优点

  • 相对于if…else,它的耦合度低
  • 相对于if…else,责任链模式更加的灵活

缺点

  • 如果处理过程比较简单,使用责任链模式增加了太多的类
  • 在找到处理类之前,所有的判定条件都要被执行一遍(if…else也有这个问题)
  • 抽象处理者 Handler 类中的 handleRequest() 方法中使用了递归,耗费栈空间

适用场景

  • 当使用if…else使代码臃肿的时候

       个人感觉职责链模式对于请求的处理是不知道最终处理者是谁,所以是运行动态寻找并指定,也就是一个if…else的灵活版;而命令模式中对于命令的处理时在创建命令是已经显式或隐式绑定了接收者

类图

Chain of Responsibility

package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class Level {    private int level = 0;    public enum UserRights {        READ(1), ADD(2), CHANGE(2), UPDATE(2), DELETE(3);        private int code;        private UserRights(int code) {            this.code = code;        }        public int getCode() {            return code;        }    }    public Level(String str) {        for (UserRights s : UserRights.values()) {            if (str.equalsIgnoreCase(s.name())) {                this.level = s.getCode();            }        }        if (level == 0) {            level = Integer.MAX_VALUE;        }    }    public boolean above(Level level) {        if (this.level >= level.level) {            return true;        }        return false;    }}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class Request {    Level level;    public Request(Level level) {        this.level = level;    }    public Level getLevel() {        return level;    }}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public abstract class Handler {    private Handler nextHandler;    public final void handleRequese(Request request) {        if(this.getHandlerLevel().above(request.getLevel())) {            this.response(request);        } else {            if(this.nextHandler != null) {                this.nextHandler.handleRequese(request);            } else {                System.out.println("没有合适处理器");            }        }    }    public void setNextHandler(Handler handler) {        this.nextHandler = handler;    }    protected abstract Level getHandlerLevel();    public abstract void response(Request request);}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class OrdinaryUser extends Handler {    @Override    protected Level getHandlerLevel() {        return new Level("READ");    }    @Override    public void response(Request request) {        System.out.println("我是普通用户,由我便可执行READ操作");    }}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class Administrators extends Handler {    @Override    protected Level getHandlerLevel() {        //ADD, CHANGE, UPDATE得到的level.level均为2,所以此处传参数ADD即可        return new Level("ADD");    }    @Override    public void response(Request request) {        System.out.println("我是管理员,由我便可执行ADD、CHANGE、UPDATE操作");    }}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class Root extends Handler {    @Override    protected Level getHandlerLevel() {        return new Level("DELETE");    }    @Override    public void response(Request request) {        System.out.println("我是ROOT,只有我可以执行DELETE操作");    }}
package com.vapy.behavior.ChainOfResponsibility;/** *  * @author vapy *  */public class Client {    public static void main(String[] args) {        Handler handler1 = new OrdinaryUser();        Handler handler2 = new Administrators();        Handler handler3 = new Root();        handler1.setNextHandler(handler2);        handler2.setNextHandler(handler3);        handler1.handleRequese(new Request(new Level("read")));        handler1.handleRequese(new Request(new Level("change")));        handler1.handleRequese(new Request(new Level("DELETE")));    }}

ChainOfResponsibilityResult
本文代码可在github查看:点击此处

5 0
原创粉丝点击