设计模式之责任链

责任链模式

概念及目的

也称职责链模式

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


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

UML

这里写图片描述

例子

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

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];
}

效果
这里写图片描述

补充

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值