责任链模式:设计模式系列(十九)
in Archived / Pattern
责任链模式(Chain of Responsibility Pattern):是一种将事件处理方式以对象为载体,连成一条处理用的责任链,让不同的对象处理对应的事件的设计模式,归类为行为型模式。
这一模式的解读分为以下几个方面:
- 事件处理以对象为载体。
- 对象与对象之间以链的形式进行关联。
使用责任链模式的思考过程如下:
- 需要处理一系列的事件时,并不完全明确每一次是什么事件。
- 按照事件的结构等级,创建事件的处理实现类,并按照结构进行链式关联。
- 当事件触发时,事件处理对象遍历处理方法,不能处理的则传递给下一个对象进行判断,直到能处理为止。
明确一下结构,责任链模式结构包含处理实现类,从处理实现类抽象出来的接口或协议。
责任链模式示例代码如下(Swift语言):
protocol HandlerBluePrint{
var level:Int{get set};
var next:HandlerBluePrint?{get set};
init(level:Int);
func handle(level:Int);
}
class Handler:HandlerBluePrint{
var level:Int;
var next:HandlerBluePrint?;
required init(level:Int){
self.level = level;
}
func handle(level:Int){
if(level == self.level){
print("level \(self.level)");
}else{
if(self.next == nil){
print("can not be handled");
}else{
self.next?.handle(level);
}
}
}
}
var h1:HandlerBluePrint = Handler(level: 1);
var h2:HandlerBluePrint = Handler(level: 2);
var h3:HandlerBluePrint = Handler(level: 3);
h1.next = h2;
h2.next = h3;
var request1:Int = 1;
var request2:Int = 2;
var request3:Int = 3;
h1.handle(request1);
h1.handle(request2);
h1.handle(request3);
代码分析:可以看到h1
、h2
、h3
都是处理类的实例对象,并且互相关联成一条链,当需要处理事件时,从h1
往下传递处理的事件,如果当层能处理就结束。代码写得比较简单,算是狭义的责任链模式。Handler
实现类遵循了HandlerBluePrint
协议,同样的,可以再创建其它不同的处理实现类遵循HandlerBluePrint
,而不同的实现类之间再以链装进行联系,那么处理事件就变得很灵活。另外,也能把handle
方法的参数设置成像Request
这样的协议或接口或祖先类,返回值类型设置为像Response
这样的协议或接口或祖先类,那么请求的对象也能变得灵活了,返回的回应也能更加灵活。以下时上面代码的输出结果:
level 1
level 2
level 3
总结:责任链模式本质是让多个对象处理请求,其可扩展性和灵活性都很大,相对于像if那样的控制流语句,这样的设计模式会让代码更低耦合,而且,假如清楚处理等级,还可以从其中的处理中直接调用处理对象,减少遍历处理代价。但需要注意的一点是由于使用链式关联,在建立联系的时候,不要出现循环链,不然在某些请求不符合时会出现循环传递请求的结果。