责任链模式
1. 责任链模式的定义
责任链设计模式是行为型模式的一种,在责任链模里,有多个处理请求的对象,其中每一个请求都引用了其下家的对象,从而形成了一条处理请求的链。请求在这条链上传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。发出这个请求的客户端并不知道是链上的哪一个对象处理了这个请求,从而避免了请求的发送者和处理者之间的耦合关系。
2. 责任链模式中的角色
2.1 UML结构图:
责任链模式中涉及到的角色:
Handler(抽象处理者角色):责任链模式需要一个处理请求的总接口,通常用来定义处理者所需的基本方法,
- 定义一个处理请求的方法、
- 定义一个设置和获取下家引用的方法
ConcreteHandlers(具体的处理程序):
- 处理它负责的请求
- 可访问它的后继者
- 如果无法处理请求,则传递给下一个处理者
Client(客户端):
- 向 Handler(处理程序)提交一个请求
2.2 责任链模式的优缺点及适用场景:
优点:
- 降低了请求者和接收者的耦合度,请求者不必知道哪个处理者能处理它的请求。
- 灵活性,动态的改变责任链,可以增加,删除或者调整链内成员的顺序
- 让各个处理者专注自己的职责
缺点:
- 不能保证请求一定被处理
- 降低处理请求的效率
- 不容易观察运行时的特征,有碍于排错
适用场景:
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求。
责任链模式又有纯与不纯的区别:
纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。反之,则就是不纯的责任链模式。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
3. 使用
责任链模式的关键就是对 请求处理者的抽象
public abstract class Handler {
//持有后继的责任对象
protected Handler successor;
//处理请求的方法,可根据情况选择是否需要传参
public abstract void handleRequest(String request);
//设置和获取责任对象
public void setSuccessor(Handler successor){
this.successor = successor;
}
public Handler getSuccessor(){
return successor;
}
}
具体处理者角色:
public class ConcreteHandler extends Handler {
public void handleRequest(String request) {
if (请求满足条件) {
//处理请求
}else {
this.successor.handleRequest(request); //转发请求
}
}
}
客户端角色:
public class Client {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
handler1.setSuccessor(handler2);
//提交请求
handler1.handleRequest("request");
}
}
本例的逻辑很简单:如果第一个处理者对象能够处理请求则处理,否则将请求传递个下一家处理者对象。
到此我们就实现了一个简单的责任链模式了。
参考:
百度百科:责任链模式
设计模式GoF