责任链模式
概念及目的
也称职责链模式
避免将一个请求的发送者与接收这耦合在一起, 让多个对象都有机会处理请求. 将接收请求的对象连接成一条链, 并且沿着这条链传递请求, 直到有一个对象能够处理它为止
责任链模式可以把发送者和接收者进行解耦合,发送方只需把消息发送出去即可,接收者负责对消息进行处理,在工作中,有时候我们可能会遇到这样的情况, 你出差了或者你加班了, 需要向领导发送邮件,而领导则需要向他的领导发送邮件,这样一级一级的向上汇报,直到可以给你报销费用的的领导审批之后,你才能拿到辛苦费,如果你之前和哪位领导干过架,完了,人家不给你上报,那你就惨了
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];
}
效果
![](https://img.haomeiwen.com/i5157505/0d8c75806195aefe.png)
补充
![](https://img.haomeiwen.com/i5157505/33b1fa5b891f5dc0.png)
这就是iOS 中UIView对事件处理的响应函数,这个我们就可以看做是责任链模式的例子。
网友评论