首页 > 编程笔记 > Java笔记

责任链模式和建造者模式结合使用

因为责任链模式具备链式结构,而在《责任链模式实现热插拔权限控制》一节的代码中,负责组装链式结构的角色是 MemberService。但是当链式结构较长时,MemberService 的工作会非常繁琐,且代码臃肿。如果需要更改处理者或消息类型,都必须在 MemberService 中进行修改,不符合开闭原则。

产生以上问题的原因就是链式结构的组装过于复杂。对于复杂结构的创建,我们可以使用建造者模式。建造者模式可以完全对 MemberService 指定的处理节点对象进行自动链式组装,客户只需要指定处理节点对象,不用关心其它任何事情。根据客户指定的处理节点对象顺序的不同,构造出来的链式结构也随之不同。

下面我们结合使用责任链模式和建造者模式修改《责任链模式实现热插拔权限控制》中的代码。首先修改 Handler 的代码。
public abstract class Handler<T> {
    protected Handler chain;

    public void next(Handler handler) {
        this.chain = handler;
    }

    public abstract void doHandler(Member member);

    public static class Builder<T> {
        private Handler<T> head;
        private Handler<T> tail;

        public Builder<T> addHandler(Handler<T> handler) {
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
            return this;
        }

        public Handler<T> build() {
            return this.head;
        }
    }
}
然后修改 MemberService 的代码。
public class MemberService {
    public void login(String userName, String password) {

        Handler.Builder builder = new Handler.Builder();

        builder.addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());

        builder.build().doHandler(new Member(userName, password));

    }
}
由于建造者模式要构建的是节点处理者,所以这里我们把 Builder 作为 Handler 的静态内部类,并且因为客户端不需要进行链式封装,所以还可以把链式组装方法 next() 设置为 private,使 Handler 更加高聚合,代码如下。
public abstract class Handler<T> {
    protected Handler chain;
    
    private void next(Handler handler) {
        this.chain = handler;
    }
    ...
}
通过本节案例,相信小伙伴们已经感受到责任链模式和建造者模式结合的精髓了。

所有教程

优秀文章