责任链模式
- 一、责任链模式的概念与角色
- 二、责任链模式的应用场景
- 三、无使用责任链模式的代码示例
- 四、使用责任链模式的代码示例
- 五、责任链模式与建造者模式的结合
- 六、责任链模式的优缺点
- 七、设计模式的相关博客文章链接
- 1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码
- 2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)
- 3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
- 4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)
- 5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)
- 6、门面模式详解附有代码案例分析
- 7、装饰者模式详解附有代码案例分析
- 8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)
- 9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
- 10、桥接模式详解附有代码案例分析
- 11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)
- 12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)
- 13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
- 14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)
- 15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)
- 16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)
- 17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)
- 18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)
- 19、备忘录模式详解附有代码案例分析
- 20、中介者模式详解附有代码案例分析
- 21、解释器模式详解附有代码案例分析
- 22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)
- 23、访问者模式详解附有代码案例分析
一、责任链模式的概念与角色
(一)、责任链模式的概念
责任链模式是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式得本质是解耦请求和处理,让请求在处理链中能进行传递与被处理。理解责任链模式应该理解其模式,而不是其具体实现。责任链模式将节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动了起来。
(二)、责任链模式的角色
1、抽象处理者(Handler):定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的引用。
2、具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发。
二、责任链模式的应用场景
1、多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
三、无使用责任链模式的代码示例
Member:
public class Member {
private String loginName;
private String loginPass;
private String roleName;
public Member(String loginName, String loginPass) {
this.loginName = loginName;
this.loginPass = loginPass;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPass() {
return loginPass;
}
public void setLoginPass(String loginPass) {
this.loginPass = loginPass;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Override
public String toString() {
return "Member{" +
"loginName='" + loginName + '\'' +
", loginPass='" + loginPass + '\'' +
", roleName='" + roleName + '\'' +
'}';
}
}
MemberService:
public class MemberService {
public void login(String loginName, String loginPass) {
if (loginName.isEmpty() || loginPass.isEmpty()) {
System.out.println("用户名与密码不可为空");
return;
}
System.out.println("用户名和密码不为空,可进行下一步");
Member member = checkExists(loginName, loginPass);
if (null == member) {
System.out.println("用户不存在");
return;
}
System.out.println("登录成功");
if (!"管理员".equals(member.getRoleName())) {
System.out.println("您不是管理员,无操作权限");
return;
}
System.out.println("您是管理员,允许操作");
}
private Member checkExists(String loginName, String loginPass) {
Member member = new Member(loginName, loginPass);
member.setRoleName("管理员");
return member;
}
}
测试类:
public class Test {
public static void main(String[] args) {
MemberService memberService = new MemberService();
memberService.login("huang", "123");
}
}
四、使用责任链模式的代码示例
Member:
public class Member {
private String loginName;
private String loginPass;
private String roleName;
public Member(String loginName, String loginPass) {
this.loginName = loginName;
this.loginPass = loginPass;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPass() {
return loginPass;
}
public void setLoginPass(String loginPass) {
this.loginPass = loginPass;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Override
public String toString() {
return "Member{" +
"loginName='" + loginName + '\'' +
", loginPass='" + loginPass + '\'' +
", roleName='" + roleName + '\'' +
'}';
}
}
Handler:
public abstract class Handler {
protected Handler chain;
public void next(Handler handler) {
this.chain = handler;
}
public abstract void doHandler(Member member);
}
ValidateHandler:
public class ValidateHandler extends Handler {
@Override
public void doHandler(Member member) {
if (member.getLoginName().isEmpty() || member.getLoginPass().isEmpty()) {
System.out.println("用户名或密码为空");
return;
}
System.out.println("用户名与密码不为空,可进行下一步");
chain.doHandler(member);
}
}
LoginHandler:
public class LoginHandler extends Handler {
@Override
public void doHandler(Member member) {
System.out.println("登录成功");
member.setRoleName("管理员");
chain.doHandler(member);
}
}
AuthHandler:
public class AuthHandler extends Handler{
@Override
public void doHandler(Member member) {
if (!"管理员".equals(member.getRoleName())){
System.out.println("您不是管理员,无操作权限");
return;
}
System.out.println("您是管理员,允许操作");
}
}
MemberService:
public class MemberService {
public void login(String loginName, String loginPass) {
Handler validateHandler = new ValidateHandler();
Handler loginHandler = new LoginHandler();
Handler authHandler = new AuthHandler();
validateHandler.next(loginHandler);
loginHandler.next(authHandler);
validateHandler.doHandler(new Member(loginName, loginPass));
}
}
测试类:
public class Test {
public static void main(String[] args) {
MemberService memberService = new MemberService();
memberService.login("huang", "123");
}
}
五、责任链模式与建造者模式的结合
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 loginName, String loginPass) {
Handler.Builder builder = new Handler.Builder();
Handler.Builder builder1 = builder.addHandler(new ValidateHandler())
.addHandler(new LoginHandler())
.addHandler(new AuthHandler());
builder.build().doHandler(new Member(loginName, loginPass));
}
}
六、责任链模式的优缺点
(一)、责任链模式的优点
1、将请求与处理解耦
2、请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象。
3、具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。
4、链路结构灵活,可以改变链路结果动态地新增或删减责任。
5、易于扩展新的请求处理类(节点),符合开闭原则。
(二)、责任链模式的缺点
1、责任链太长或者处理时间过长,会影响整体性能。
2、如果节点对象存在循环引用,会造成死循环,导致系统崩溃。
七、设计模式的相关博客文章链接
1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码
链接: 七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码.
2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)
链接: 工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂).
3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
链接: 单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式).
4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)
链接: 原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析).
5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)
链接: 建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析).
6、门面模式详解附有代码案例分析
链接: 门面模式详解附有代码案例分析.
7、装饰者模式详解附有代码案例分析
链接: 装饰者模式详解附有代码案例分析.
8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)
链接: 享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用).
9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
链接: 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例).
10、桥接模式详解附有代码案例分析
链接: 桥接模式详解附有代码案例分析.
11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)
链接: 适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例).
12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)
链接: 委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析).
13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
链接: 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例).
14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)
链接: 策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例).
15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)
链接: 责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例).
16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)
链接: 迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析).
17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)
链接: 命令模式详解附有代码案例分析(包含命令模式的源码应用分析).
18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)
链接: 状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比).
19、备忘录模式详解附有代码案例分析
链接: 备忘录模式详解附有代码案例分析.
20、中介者模式详解附有代码案例分析
链接: 中介者模式详解附有代码案例分析.
21、解释器模式详解附有代码案例分析
链接: 解释器模式详解附有代码案例分析.
22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)
链接: 观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现).
23、访问者模式详解附有代码案例分析
链接: 访问者模式详解附有代码案例分析.