责任链模式:当想要一个以上的对象有机会处理某个请求时就使用责任链模式
责任链模式是行为型模式之一。这个模式也很简单,看模式给的定义就能很容易明白责任链模式就是让请求通过链式传递,一个责任处理不了,就传递给下一个责任来处理,直到请求被处理,或者被吞掉(没有响应者,最后不做处理)。

举个栗子
我们的产品上架后收到了来自社会的大量反馈邮件。这邮件中有粉丝的邮件,这些邮件需要提交给CEO,有客户抱怨的邮件需要提交给产品,有客户对我们有合作意向的需要把邮件转发给业务部门,有垃圾邮件,对于这种邮件直接过滤掉。
假如我们的AI产品可以识别这些邮件的类型,我们怎么开发一个项目让这些邮件能准确的转发给相关部门及具体工作人员。
责任链的实现
#import <Foundation/Foundation.h>
#import "AIMessageRecognize.h"
@class Email;
NS_ASSUME_NONNULL_BEGIN
@interface MessageHandler : NSObject
@property (nonatomic ,strong)MessageHandler * next;
-(void)disposeEmail:(Email *)email;
@end
NS_ASSUME_NONNULL_END
#import "MessageHandler.h"
@implementation MessageHandler
-(void)disposeEmail:(Email *)email {
[_next disposeEmail:email];
}
@end
CEO 的责任响应
#import "CEOMessageHandler.h"
@implementation CEOMessageHandler
-(void)disposeEmail:(Email *)email {
if ([[AIMessageRecognize recognizeEmail:email] isEqualToString:@"CEO"]) {
NSLog(@"将邮件发送给CEO");
return;
}
[self.next disposeEmail:email];
}
@end
产品的责任响应
#import "PMMessageHandler.h"
@implementation PMMessageHandler
-(void)disposeEmail:(Email *)email {
if ([[AIMessageRecognize recognizeEmail:email] isEqualToString:@"PM"]) {
NSLog(@"将邮件发送给产品经理");
return;
}
[self.next disposeEmail:email];
}
@end
业务部门的责任响应
#import "BSMessageHandler.h"
@implementation BSMessageHandler
-(void)disposeEmail:(Email *)email {
if ([[AIMessageRecognize recognizeEmail:email] isEqualToString:@"BS"]) {
NSLog(@"将邮件发送给业务部");
return;
}
[self.next disposeEmail:email];
}
@end
垃圾消息不用响应,啥也不处理,消息会被父类转发给空对象,然后被吞掉。当然我们也可以添加删除垃圾邮件的逻辑。
AI识别邮件的逻辑。
#import "AIMessageRecognize.h"
#import "Email.h"
@implementation AIMessageRecognize
//这里没法模拟AI识别邮件。所以采用简单的做法
+(NSString *)recognizeEmail:(Email *)emial {
int result = arc4random() % 4;
switch (result) {
case 0:
return @"CEO";
case 1:
return @"PM";
case 2:
return @"BS";
case 3:
return @"RBS";
}
@throw [NSException exceptionWithName:@"越界了" reason:@"result 不得越界" userInfo:nil];
}
@end
具体调用
#import <Foundation/Foundation.h>
#import "CEOMessageHandler.h"
#import "PMMessageHandler.h"
#import "BSMessageHandler.h"
#import "RBSMessageHandler.h"
#import "Email.h"
int main(int argc, const char * argv[]) {
CEOMessageHandler * ceo = [[CEOMessageHandler alloc] init];
PMMessageHandler * pm = [[PMMessageHandler alloc] init];
BSMessageHandler * bs = [[BSMessageHandler alloc] init];
RBSMessageHandler * rbs = [[RBSMessageHandler alloc] init];
ceo.next = pm;
pm.next = bs;
bs.next = rbs;
for (int i = 0; i < 100; i++) {
Email * email = [[Email alloc] init];
[ceo disposeEmail:email];
}
return 0;
}
优点
1.将请求的发送者和接收者实现解耦
2.可以简化对象,因为它不需要知道链的结构
3.可以改变责任链的顺序,允许动态的新增删除责任。
缺点
1.并不能保证责任一定执行,可能任务一直传递到链尾也执行不了(有的时候也可以是一个优点,比如说我们上面的垃圾消息,我们本身可以不处理它。)
2.不容易观察运行时的情况,当出错的时候不容易定位到具体的位置。
网友评论