美文网首页
责任链模式

责任链模式

作者: Colin_狂奔的蚂蚁 | 来源:发表于2018-06-23 15:35 被阅读20次

责任链模式

责任链模式的主要思想是,对象引用了同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的方法,处理对链中第一个对象发起的同一个请求。如果一个对象不知道如何处理请求,它就把请求传递给下一个响应者。

责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

责任链模式的本质
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

相关文章

网友评论

      本文标题:责任链模式

      本文链接:https://www.haomeiwen.com/subject/drzryftx.html