为什么有责任链模式
传统的软件模式,用户发起请求,需要知道这个请求具体是有谁来处理,如果整个请求处理流程实际多个处理者,那么用户发起请求就需要知道所有的请求者。
这样的缺点就是向用户暴露了太多的内部细节,不安全,而且也造成了系统的复杂性。
责任链模式就是解决这个问题。
责任链的核心就是作为请求者不需要知道请求是由谁来处理的,只需要把请求发给第一个处理者,最终会返回一个处理后的结果。
责任链模式屏蔽了请求的处理过程,发起的请求到底是由谁来处理的,不需要关心。
责任链在实际应用场景
一:比如在用户存钱。
一个存款请求,一个处理者,只能处理人民币。 但是随着业务的发展,请求者的数量增加,处理的类型也增加了,还需要处理美元,欧元,日元等。
这个时候就可以用责任链模式,在第一个处理者后面添加一个链,如果是存人民币,就仍然使用第一个业务逻辑来处理,如果是美元就传递给第二个处理逻辑来处理,如果是日元,欧元,依次传递下去。
这样的好处是,只需要扩展实现类就可以解决需求变更的问题,不需要对原有的业务逻辑做大的更改。
二:用户注册
业务需求:在页面上有用户注册功能:
注册用户分两种: VIP用户和普通用户
-
一:VIP用户,已经办理过业务。
VIP用户比普通用户多一个输入项: VIP序列号。注册之后还需要激活。
VIP用户的激活流程也比较特殊:VIP是自动发送到用户的邮箱中,就算激活成功。 -
二:普通用户:注册需要填写一系列信息,不需要VIP序列号。
激活,需要短信验证码。因为这样可以获得用户手机号,这样就可以给用户发送广告短信,哈哈哈。
这个场景就可以使用责任链模式。
从前台传递过来的用户信息,无论是VIP用户,还是普通用户,统一传递到一个接口,通过责任链完成任务的处理。
比如定义一个RegisterAction类,把通过HTTP传递过来的对象进行组装,组装成一个HashMap类型的对象UserInfoMap,传递给Handler接口的两个实现类。
具体由哪一个类来处理,根据HashMap上的用户表示来决定。
责任链模式的代码示例
分为抽象类,具体实现类,几个属性类,最后场景类:
抽象类
package com.company.ChainOfResponsibiliyPattern;
/*
抽象处理者:
然后在需要定义几个具体的实现者,几个实现类
*/
public abstract class Handler {
private Handler nextHandler;
//每个处理者都必须对请求作出处理
public final Response handlerMessage(Request request) {
Response response = null;
//判断是否是自己的处理级别
if(this.getHandlerLevel().equals(request.getRequestLevel())) {
response = this.echo(request);
}
else {//不属于自己的级别
//判断是否有下一个处理者
if(this.nextHandler != null) {
response = this.nextHandler.handlerMessage(request);
}
else {
//如果没有下一个处理者,业务自行处理
}
}
return response;
}
//设置下一个处理者是谁
public void setNext(Handler handler2) {
this.nextHandler = handler2;
}
//每个处理者都有一个处理级别
protected abstract Level getHandlerLevel();
//每个处理者都必须实现处理任务
protected abstract Response echo(Request request);
}
具体实现类
package com.company.ChainOfResponsibiliyPattern;
public class ConcreteHandler1 extends Handler{
//定义自己的处理逻辑
protected Response echo(Request request) {
//完成处理逻辑
return null;
}
//设置自己的处理级别
protected Level getHandlerLevel() {
//设置自己的处理级别
return null;
}
}
package com.company.ChainOfResponsibiliyPattern;
public class ConcreteHandler2 extends Handler{
//定义自己的处理逻辑
protected Response echo(Request request) {
//完成处理逻辑
return null;
}
//设置自己的处理级别
protected Level getHandlerLevel() {
//设置自己的处理级别
return null;
}
}
package com.company.ChainOfResponsibiliyPattern;
public class ConcreteHandler3 extends Handler{
//定义自己的处理逻辑
protected Response echo(Request request) {
//完成处理逻辑
return null;
}
//设置自己的处理级别
protected Level getHandlerLevel() {
//设置自己的处理级别
return null;
}
}
几个属性类
package com.company.ChainOfResponsibiliyPattern;
/*
负责定义请求和处理级别
*/
public class Level {
//定义一个请求和处理级别
}
package com.company.ChainOfResponsibiliyPattern;
/*
功能: 负责封装请求
*/
public class Request {
//请求的等级
public Level getRequestLevel() {
return null;
}
}
package com.company.ChainOfResponsibiliyPattern;
/*
功能: 负责封装链中返回的结果
*/
public class Response {
//负责封装链中返回的结果
}
场景类
package com.company.ChainOfResponsibiliyPattern;
/*
场景类: 在场景类当中,对链进行组装
*/
public class Client {
public static void main(String[] args) {
//声明所有的处理节点
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//设置链当中,不同阶段的顺序 1 --》 2 -- 》 3
handler1.setNext(handler2);
handler2.setNext(handler3);
//提交请求,返回结果
Response response = handler1.handlerMessage(new Request());
}
}
参考书籍
《设计模式之禅》 秦小波