設計模式-責任鏈模式

模式定義:使多個對象都有計劃處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。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

 責任鏈模式的每一個職責對象只負責處理本身處理的那部分,所以可能會出現某個請求,把整個責任鏈傳遞完也沒有職責對象處理它。這就須要在使用責任鏈的時候,須要提供默認的處理,而且注意構建鏈的有效性

相關文章
相關標籤/搜索