设计模式-责任链

引用:《 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的请求

小结:
责任链中响应器负责处理单一功能,方便添加、删除等后期维护,避免单个类代码臃肿不方便维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值