責(zé)任鏈模式
責(zé)任鏈模式的主要思想是超陆,對象引用了同一類型的另一個(gè)對象儒恋,形成一條鏈湖笨。鏈中的每個(gè)對象實(shí)現(xiàn)了同樣的方法剥悟,處理對鏈中第一個(gè)對象發(fā)起的同一個(gè)請求灵寺。如果一個(gè)對象不知道如何處理請求,它就把請求傳遞給下一個(gè)響應(yīng)者区岗。
責(zé)任鏈模式:使多個(gè)對象都有機(jī)會處理請求略板,從而避免請求的發(fā)送者和接收者之間發(fā)生耦合。此模式將這些對象連成一條鏈慈缔,并沿著這條鏈傳遞請求叮称,直到有一個(gè)對象處理它為止。
責(zé)任鏈模式的本質(zhì)
1 讓請求者不關(guān)心具體接收者是誰,只需要得到自己的具體結(jié)果
2 在一個(gè)請求對應(yīng)多個(gè)接收者情況下(Spring Security這種),接收者之間可以自由組合,靈活性很高
3 新增接收者處理也只需要增加鏈中的一個(gè)節(jié)點(diǎn),不需要改動太多.
責(zé)任鏈模式的UML類圖
測試代碼:
#import "ViewController.h"
#import "Handler.h"
#import "DutyOne.h"
#import "DutyTwo.h"
#import "DutyThrid.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Handler* dutyOne = [DutyOne new];
Handler* dutyTwo = [DutyTwo new];
Handler* dutyThrid = [DutyThrid new];
dutyOne.successor = dutyTwo;
dutyTwo.successor = dutyThrid;
Person * p1 = [Person new];
p1.name = @"ll";
[dutyOne handleRequest:p1];
}
@end
2018-06-23 15:28:36.716342+0800 Duty[44650:2391873] 我不認(rèn)識ll 向下一個(gè)責(zé)任人傳遞
2018-06-23 15:28:36.716470+0800 Duty[44650:2391873] 我不認(rèn)識ll 向下一個(gè)責(zé)任人傳遞
2018-06-23 15:28:36.716563+0800 Duty[44650:2391873] 沒人認(rèn)識:ll
其它文件:
===================Handler文件===================
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Handler : NSObject
// 對下一個(gè)對象進(jìn)行引用
@property (nonatomic, strong) Handler *successor;
// 處理請求的接口
- (void)handleRequest:(Person *)request;
@end
#import "Handler.h"
@implementation Handler
@end
===================Person文件===================
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,copy)NSString* name;
@end
#import "Person.h"
@implementation Person
@end
===================DutyOne文件===================
#import <Foundation/Foundation.h>
#import "Handler.h"
@interface DutyOne : Handler
@end
#import "DutyOne.h"
@implementation DutyOne
- (void)handleRequest:(Person *)request{
if([request.name isEqualToString:@"zs"]){
NSLog(@"張三我認(rèn)識");
} else {
NSLog(@"我不認(rèn)識%@ 向下一個(gè)責(zé)任人傳遞",request.name);
[self.successor handleRequest:request];
}
}
@end
===================DutyTwo文件===================
#import "Handler.h"
@interface DutyTwo : Handler
@end
#import "DutyTwo.h"
@implementation DutyTwo
- (void)handleRequest:(Person *)request{
if([request.name isEqualToString:@"ls"]){
NSLog(@"李四我認(rèn)識");
} else {
NSLog(@"我不認(rèn)識%@ 向下一個(gè)責(zé)任人傳遞",request.name);
[self.successor handleRequest:request];
}
}
@end
===================DutyThrid文件===================
#import "Handler.h"
@interface DutyThrid : Handler
@end
#import "DutyThrid.h"
#import "Person.h"
@implementation DutyThrid
- (void)handleRequest:(Person *)request{
if([request.name isEqualToString:@"ww"]){
NSLog(@"王五我認(rèn)識");
} else {
NSLog(@"沒人認(rèn)識:%@",request.name);
}
}
@end