美文网首页
设计模式之责任链

设计模式之责任链

作者: 锦鲤跃龙 | 来源:发表于2018-08-14 17:10 被阅读0次

责任链模式

概念及目的

也称职责链模式

避免将一个请求的发送者与接收这耦合在一起, 让多个对象都有机会处理请求. 将接收请求的对象连接成一条链, 并且沿着这条链传递请求, 直到有一个对象能够处理它为止


责任链模式可以把发送者和接收者进行解耦合,发送方只需把消息发送出去即可,接收者负责对消息进行处理,在工作中,有时候我们可能会遇到这样的情况, 你出差了或者你加班了, 需要向领导发送邮件,而领导则需要向他的领导发送邮件,这样一级一级的向上汇报,直到可以给你报销费用的的领导审批之后,你才能拿到辛苦费,如果你之前和哪位领导干过架,完了,人家不给你上报,那你就惨了

UML

[图片上传失败...(image-bb8-1534237779838)]

例子

人穿盔甲、魔抗,如果攻击的是刀剑,盔甲可以防御;攻击的是魔法伤害,魔抗可以防御,其他的话,人就受伤了。

1.防御者超类

#import <Foundation/Foundation.h>
#import "GongJi.h"

@interface Handler : NSObject
// 下一个响应者
@property (nonatomic, strong) Handler *nextHandler;

// 处理请求的接口
- (void)handleRequest:(GongJi *)request;
@end

#import "Handler.h"

@implementation Handler

- (void)handleRequest:(GongJi *)attack {
    // 如果不能响应, 就把请求转发给successor来处理就行了
    [self.nextHandler handleRequest:attack];
}
@end

1.1模仿防御子类

#import "Handler.h"

@interface MoKangKuiJia : Handler

@end

#import "MoKangKuiJia.h"
#import "MoFa.h"

@implementation MoKangKuiJia
-(void)handleRequest:(GongJi *)request {
    
    if ([request isKindOfClass:[MoFa class]]) {
        NSLog(@"2.攻击没有通过这个魔抗盔甲");
        
    } else {
        NSLog(@"2.不是魔法攻击,防不住,其它去处理---%@", [MoFa class]);
        [self.nextHandler handleRequest:request];
    }
}
@end

1.2屋里防御子类


@interface KuiJia : Handler

@end


#import "KuiJia.h"
#import "WuQi.h"

@implementation KuiJia

-(void)handleRequest:(GongJi *)request {

    if ([request isKindOfClass:[WuQi class]]) {
        NSLog(@"1.攻击没有通过这个盔甲");
        
    } else {
        NSLog(@"1.不是剑攻击,防不住,其它去处理---%@", [WuQi class]);
        [self.nextHandler handleRequest:request];
    }
}
@end

1.3人作为最后一层防御者

#import "Handler.h"

@interface Person : Handler

@end

#import "Person.h"

@implementation Person
- (void)handleRequest:(GongJi *)request {
    NSLog(@"被--%@--伤害到了",[request class]);
}
@end

2 攻击者


@interface GongJi : NSObject

@end

@implementation GongJi

@end

2.1 屋里伤害


@interface WuQi : GongJi

@end

@implementation WuQi

@end

2.2 魔法伤害


@interface MoFa : GongJi

@end

@implementation MoFa

@end

3 调用

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 1.创建人物
    Handler *person = [[Person alloc] init];
    
    // 2.增加魔法盾牌
    Handler *moKangKuiJia = [[MoKangKuiJia alloc] init];
    moKangKuiJia.nextHandler = person;
    
    // 3.穿盔甲
    Handler *kuiJia = [[KuiJia alloc] init];
    kuiJia.nextHandler = moKangKuiJia;
    

    // 1.武器攻击
    GongJi *wuqi = [[WuQi alloc] init];
    [kuiJia handleRequest:wuqi];
    
    NSLog(@"----------------");
    // 2.魔法攻击
    GongJi *mofa = [[MoFa alloc] init];
    [kuiJia handleRequest:mofa];
    
      NSLog(@"----------------");
    // 3.闪电攻击
    GongJi *sd = [[ShanDian alloc] init];
    [kuiJia handleRequest:sd];
}

效果


WX20180814-161550@2x.png

补充

WX20180814-164939@2x.png

这就是iOS 中UIView对事件处理的响应函数,这个我们就可以看做是责任链模式的例子。

相关文章

网友评论

      本文标题:设计模式之责任链

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