名称
责任链模式 Chain of Responsibility Pattren
用途
- 解耦消息的发送者和接受者。
- 让多个对象有机会处理某个请求(UI 响应链、Planck 中间件、流式业务流程(OA)、过滤器)。
实现
- 为某个请求创建一个对象链,每个对象依次检查次请求并对其进行处理,或者将它传递给链中的下一个对象。
- 链的实现:使用现成的链(如继承关系)或自己实现新链(next指针)
- 链上的每个对象都采用同样的接口处理或上抛事件
优点
- 解耦请求的发送者和接收者
- 简化对象(不关心链结构)
- 链内成员可以灵活增删调序
缺点
- 不保证请求一定被处理
- 灵活的长链可能给 Debug 增加复杂度
Cocoa 中的应用
- Responder Chain 使得交互事件可以通过链表依次传递来被处理(或忽略)消息。
- 与用户交互的对象(如Application, Window, View, ViewController)都是 NSResponder/UIResponder 的子类。
- 首先确定 first responder (触摸事件采用 Hit-Test),随后 responder 决定是否处理事件或通过 nextResponder 继续传递。
- 这个响应链大部分情况下是 View 的继承链,Root UIView 的 next responder 是 UIViewController,VC 的下一个是 UIWindow,最后是 UIApplocation 的 delegate 且为 UIResponder 的子类;当然也可以通过 setNextResponder: 来改变它。
自己动手实现(Objective-C Code)
1. Array 在外部维护链
YFHandler
@interface YFHandler : NSObject
@property (assign, nonatomic, readwrite) NSUInteger index;
- (BOOL)handleBusiness:(NSUInteger)index;