模式定義:使多個對象都有計劃處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。ide
@interface Request: NSObject @property (nonatomic, copy)NSString *type; @property (nonatomic, assign)int number; @end @implementation Request @end @interface Manager : NSObject @property (nonatomic, copy)NSString *name; @property (nonatomic, strong)Manager *superior; @property (nonatomic, strong)Request *req; - (instancetype)initWithName:(NSString *)name; - (void)dealRequest:(Request *)request; @end @implementation Manager - (instancetype)initWithName:(NSString *)name { if (self = [super init]) { _name = name; } return self; } - (void)dealRequest:(Request *)request { NSException *e = [NSException exceptionWithName:@"override Method dealRequest" reason:@"Must implement dealRequest" userInfo:nil]; @throw e; } @end @interface LowManger : Manager @end @implementation LowManger -(void)dealRequest:(Request *)request { if ([request.type isEqualToString:@"請假"]&&request.number < 20) { NSLog(@"小假,班主任贊成了"); }else { [self.superior dealRequest:request]; } } @end @interface MainManger : Manager @end @implementation MainManger -(void)dealRequest:(Request *)request { if ([request.type isEqualToString:@"請假"]&&request.number < 50) { NSLog(@"想了一下子,主任贊成了"); }else { [self.superior dealRequest:request]; } } @end @interface DestroyManger : Manager @end @implementation DestroyManger -(void)dealRequest:(Request *)request { if ([request.type isEqualToString:@"請假"]&&request.number < 80) { NSLog(@"想了半天,校長贊成了"); }else { NSLog(@"臥槽,管不了了"); } } @end int main(int argc, const char * argv[]) { @autoreleasepool { Request *req = [[Request alloc]init]; req.type= @"請假"; req.number = 10; // 責任鏈條 LowManger *manger = [[LowManger alloc]init]; MainManger *mainManger = [[MainManger alloc]init]; DestroyManger *desManger = [[DestroyManger alloc]init]; manger.superior = mainManger; mainManger.superior = desManger; [manger dealRequest:req]; req.number = 30; [manger dealRequest:req]; req.number = 60; [manger dealRequest:req]; req.number = 90; [manger dealRequest:req]; } return 0; }
模式的優勢:atom
1.請求者和接受者鬆散耦合code
在責任鏈模式中,請求者並不知道接受者是誰,也不知道具體如何處理請求者只負責向責任鏈發出請求就能夠了,而每一個職責對象也不用管請求者或者是其餘的職責對象,只負責處理本身的部分,其餘的就交給其餘的職責對象去處理。也就是說,請求者 和接受者是徹底接偶的。對象
2.動態組合職責it
責任鏈模式會把功能處理分散到單獨的職責對象中,而後在使用的時候,就能夠動態組合職責造成職責鏈,從而能夠靈活地給對象分配職責,也能夠靈活地實現和改變對象的職責。io
模式的缺點:class
1.產生許多細粒度對象object
責任鏈模式會把功能處理分散到單獨的職責對象中,也就是每一個職責對象處理一個方面的功能,要把一個業務處理完,須要許多職責對象的組合,這樣會產生大量的細粒度職責對象。exception
2.不必定能被處理request
責任鏈模式的每一個職責對象只負責處理本身處理的那部分,所以可能會出現某個請求,把整個責任鏈傳遞完也沒有職責對象處理它。這就須要在使用責任鏈的時候,須要提供默認的處理,而且注意構建鏈的有效性