责任链模式和建造者模式结合使用
因为责任链模式具备链式结构,而在《责任链模式实现热插拔权限控制》一节的代码中,负责组装链式结构的角色是 MemberService。但是当链式结构较长时,MemberService 的工作会非常繁琐,且代码臃肿。如果需要更改处理者或消息类型,都必须在 MemberService 中进行修改,不符合开闭原则。
产生以上问题的原因就是链式结构的组装过于复杂。对于复杂结构的创建,我们可以使用建造者模式。建造者模式可以完全对 MemberService 指定的处理节点对象进行自动链式组装,客户只需要指定处理节点对象,不用关心其它任何事情。根据客户指定的处理节点对象顺序的不同,构造出来的链式结构也随之不同。
下面我们结合使用责任链模式和建造者模式修改《责任链模式实现热插拔权限控制》中的代码。首先修改 Handler 的代码。
产生以上问题的原因就是链式结构的组装过于复杂。对于复杂结构的创建,我们可以使用建造者模式。建造者模式可以完全对 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; } ... }通过本节案例,相信小伙伴们已经感受到责任链模式和建造者模式结合的精髓了。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算