引用:《 Objective-C编程之道 iOS设计模式解析》
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,从而沿着这条链传递请求,直到有一个对象处理它为止。
责任链主要思想:很多对象引用了同一类型的另一个对象,形成了一条链。链中每个对象实现了同样的方法,处理对链中第一个对象发起的请求。如果一个对象不知道如何处理请求,它就把请求传给下一个响应器(successor)。
何时使用:
- 有多个对象可以处理请求,而处理程序只有在运行时才能决定;
- 向一组对象发出请求,而不显式指定处理请求的特定处理程序。
举例:
#pragma 责任链
typedef NS_ENUM(NSInteger,RequestType)
{
type0,
type1,
type2,
type3,
type4
};
@interface RequestDemo :NSObject
@property(nonatomic,assign) RequestType type;
@end
@implementation RequestDemo
@synthesize type;
@end
@interface BaseChainHandler:NSObject
-(void)HandleRequest:(RequestDemo *)request;
@end
@implementation BaseChainHandler
-(void)HandleRequest:(RequestDemo *)request
{
NSLog(@"处理类型为0的请求");
}
@end
@interface ChainHandler_1:BaseChainHandler
@property(nonatomic,strong) __kindof BaseChainHandler *Next;
@end
@implementation ChainHandler_1
@synthesize Next;
-(void)HandleRequest:(RequestDemo *)request
{
if (request.type== type1)
{
NSLog(@"处理类型为1的请求");
}
else
{
[Next HandleRequest:request];
}
}
@end
@interface ChainHandler_2:BaseChainHandler
@property(nonatomic,strong) __kindof BaseChainHandler *Next;
@end
@implementation ChainHandler_2
@synthesize Next;
-(void)HandleRequest:(RequestDemo *)request
{
if (request.type== type2)
{
NSLog(@"处理类型为2的请求");
}
else
{
[Next HandleRequest:request];
}
}
@end
@interface ChainHandler_3:BaseChainHandler
@property(nonatomic,strong) __kindof BaseChainHandler *Next;
@end
@implementation ChainHandler_3
@synthesize Next;
-(void)HandleRequest:(RequestDemo *)request
{
if (request.type== type3)
{
NSLog(@"处理类型为3的请求");
}
else
{
[Next HandleRequest:request];
}
}
@end
//测试:
RequestDemo *requetTest=[[RequestDemo alloc]init];
requetTest.type=type1;
//chain
BaseChainHandler *baseC=[BaseChainHandler new];
ChainHandler_1 *handler1=[ChainHandler_1 new];
handler1.Next=baseC;
ChainHandler_2 *handler2=[ChainHandler_2 new];
handler2.Next=handler1;
ChainHandler_3 *handler3=[ChainHandler_3 new];
handler3.Next=handler2;
[handler3 HandleRequest:requetTest];
//结果:
2019-05-03 10:19:36.426527+0800 Block[78391:8269889] 处理类型为1的请求
小结:
责任链中响应器负责处理单一功能,方便添加、删除等后期维护,避免单个类代码臃肿不方便维护。