美文网首页
责任链模式

责任链模式

作者: 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