责任链模式:设计模式系列(十九)

  责任链模式(Chain of Responsibility Pattern):是一种将事件处理方式以对象为载体,连成一条处理用的责任链,让不同的对象处理对应的事件的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 事件处理以对象为载体。
  • 对象与对象之间以链的形式进行关联。

  使用责任链模式的思考过程如下:

  1. 需要处理一系列的事件时,并不完全明确每一次是什么事件。
  2. 按照事件的结构等级,创建事件的处理实现类,并按照结构进行链式关联。
  3. 当事件触发时,事件处理对象遍历处理方法,不能处理的则传递给下一个对象进行判断,直到能处理为止。

  明确一下结构,责任链模式结构包含处理实现类,从处理实现类抽象出来的接口或协议。

责任链模式示例代码如下(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);

  代码分析:可以看到h1h2h3都是处理类的实例对象,并且互相关联成一条链,当需要处理事件时,从h1往下传递处理的事件,如果当层能处理就结束。代码写得比较简单,算是狭义的责任链模式。Handler实现类遵循了HandlerBluePrint协议,同样的,可以再创建其它不同的处理实现类遵循HandlerBluePrint,而不同的实现类之间再以链装进行联系,那么处理事件就变得很灵活。另外,也能把handle方法的参数设置成像Request这样的协议或接口或祖先类,返回值类型设置为像Response这样的协议或接口或祖先类,那么请求的对象也能变得灵活了,返回的回应也能更加灵活。以下时上面代码的输出结果:

level 1
level 2
level 3

  总结:责任链模式本质是让多个对象处理请求,其可扩展性和灵活性都很大,相对于像if那样的控制流语句,这样的设计模式会让代码更低耦合,而且,假如清楚处理等级,还可以从其中的处理中直接调用处理对象,减少遍历处理代价。但需要注意的一点是由于使用链式关联,在建立联系的时候,不要出现循环链,不然在某些请求不符合时会出现循环传递请求的结果。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6