设计模式-责任链模式

    我们知道Java里共有23种设计模式,责任链模式将对象连接成一条链,并沿着这条链处理请求,责任链模式属于行为型设计模式。

责任链模式

定义

是将链中每个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。

适用场景

(1) 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
(2) 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
(3) 可动态指定一组对象处理请求。

优点

(1) 将请求和处理解耦。
(2) 请求处理者(节点对象)只需要关系自己感兴趣的请求进行处理即可,对不感兴趣的请求,直接转发给下一级节点对象。
(3) 具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。
(4) 链式结构灵活,可以通过改变链路结构动态地新增或删除责任。
(5) 易于扩展新的处理请求类(节点),符合开闭原则。

缺点

(1) 责任链太长或者处理时间过长,会影响整体性能。
(2) 如果节点对象存在循环引用时,会造成死循环,导致系统崩溃。

实例

public abstract class Handler {

    protected Handler chain;

    /**
     * next节点
     */
    private void next(Handler handler) {
        this.chain = handler;
    }

    public abstract void doHandler(Member member);

    /**
     * 建造者模式与责任链模式组合使用
     */
    public static class Builder {

        private Handler head;

        private Handler tail;

        public Builder addHandler(Handler handler) {
            //单向链表
            if (this.head == null) {
                this.head = this.tail = handler;
            }
            this.tail.next(handler);
            this.tail = handler;
            return this;
        }

        /**
         * 返回head节点
         */
        public Handler build() {
            return this.head;
        }
    }
}
public class ValidateHandler extends Handler {

    @Override
    public void doHandler(Member member) {
        if (StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getPassword())) {
            System.out.println("用户名或密码为空!");
            return;
        }
        System.out.println("用户名密码核验成功,继续执行!");
        chain.doHandler(member);
    }
}
public class LoginHandler extends Handler {

    @Override
    public void doHandler(Member member) {
        System.out.println("登录成功!");
        member.setRoleName("管理员");
        chain.doHandler(member);
    }
}
public class AuthHandler extends Handler {

    @Override
    public void doHandler(Member member) {
        if (!"管理员".equals(member.getRoleName())) {
            System.out.println("您不是管理员,暂无权限!");
            return;
        }
        System.out.println("您是管理员,允许操作!");
    }
}
@Data
public class Member {

   private String loginName;

   private String password;

   private String roleName;
}
public class Test {

    public static void main(String[] args) {
        Handler.Builder builder = new Handler.Builder();
        //链式编程
        builder.addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());

        builder.build().doHandler(new Member("Tom", "123456"));
    }
}
以上为个人对责任链模式的总结。

你可能感兴趣的:(设计模式-责任链模式)