责任链模式
责任链模式的主要思想是,对象引用了同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的方法,处理对链中第一个对象发起的同一个请求。如果一个对象不知道如何处理请求,它就把请求传递给下一个响应者。
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
责任链模式的本质
1 让请求者不关心具体接收者是谁,只需要得到自己的具体结果
2 在一个请求对应多个接收者情况下(Spring Security这种),接收者之间可以自由组合,灵活性很高
3 新增接收者处理也只需要增加链中的一个节点,不需要改动太多.
责任链模式的UML类图
责任链模式的UML类图.png测试代码:
#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] 我不认识ll 向下一个责任人传递
2018-06-23 15:28:36.716470+0800 Duty[44650:2391873] 我不认识ll 向下一个责任人传递
2018-06-23 15:28:36.716563+0800 Duty[44650:2391873] 没人认识:ll
其它文件:
===================Handler文件===================
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Handler : NSObject
// 对下一个对象进行引用
@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(@"张三我认识");
} else {
NSLog(@"我不认识%@ 向下一个责任人传递",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(@"李四我认识");
} else {
NSLog(@"我不认识%@ 向下一个责任人传递",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(@"王五我认识");
} else {
NSLog(@"没人认识:%@",request.name);
}
}
@end
网友评论