demo上有常见的设计模式实现,都是从<<设计模式之禅第2版.pdf>>java版转成OC的,像什么单例模式、迭代器模式、原型模式太过简单或太过常见,已被我忽略。第3章是本文内容,责任链模式的应用。
最近碰到一个需求,需要在点击书架弹出推送弹窗。在这之前点击书架弹出有蒙层弹窗、评分弹窗。需求要求点一次谈一个窗,里面涉及业务逻辑复杂,if else虽然能处理当前逻辑,但明显有点力不从心。考虑到扩展性,和解耦,我第一想到的是责任链模式。
责任链模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
抽象的处理者实现三个职责:一是定义一个请求的处理方法handleMessage,唯一对外开放的方法;二是定义一个链的编排方法setNext,设置下一个处理者;三是定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLevel和具体的处理任务echo。
下面谈谈具体的实现:
一、定义请求协议
typedef NS_ENUM(NSInteger,AlertViewType) {
apnsAlertViewType,
liveFooterViewType,
specalMusicViewType,
rateViewControllerType,
};
@protocol AlertViewRequestProtocol <NSObject>
@optional
- (AlertViewType)getCurAlertViewType;
@end
二、定义响应的协议
#import "AlertViewRequestProtocol.h"
@protocol AlertViewHandlerProtocol <NSObject>
- (void)handleMessage:(id<AlertViewRequestProtocol>)women;
- (void)respons:(id<AlertViewRequestProtocol>)women;
@end
三、定义AlertViewHandler,处理响应消息
- (void)handleMessage:(id<AlertViewRequestProtocol>)alertView{
if (alertView.getCurAlertViewType == [self getCurAlertViewType]) {
[self respons:alertView];
}else{
if (_nextHandler) {
[_nextHandler handleMessage:alertView];
}else{
NSLog(@"后续没有了,不用处理");
}
}
}
- (void)setNext:(AlertViewHandler *)handler{
_nextHandler = handler;
}
- (void)respons:(id<AlertViewRequestProtocol>)alertView{
NSLog(@"AlertViewHandler respons");
}
四、子类view继承AlertViewHandler,每个子类实现下面方法
#pragma mark - 责任链模式
- (AlertViewType)getCurAlertViewType{
return apnsAlertViewType;
}
- (void)respons:(id<AlertViewRequestProtocol>)alertView{
[self show];
}
五、设置请求消息
- (id)initWithType:(AlertViewType)type{
self = [super init];
if (self) {
_type = type;
}
return self;
}
- (AlertViewType)getCurAlertViewType{
return _type;
}
六、调用消息
CMApnsAlertView * apnsAlertView = [[CMApnsAlertView alloc] init];
LiveFooterView * footerView = [LiveFooterView createLiveFooterView];
SpecalMusicView * specalMusicView = [SpecalMusicView createSpecalView];
[apnsAlertView setNext:footerView];
[footerView setNext:specalMusicView];
AlertViewType type = apnsAlertViewType;
if (alertCount%3 == 0) {
type = apnsAlertViewType;
}else if (alertCount%3 == 1){
type = liveFooterViewType;
}else if (alertCount%3 == 2){
type = specalMusicViewType;
}
alertCount++;
[apnsAlertView handleMessage:[[AlertViewRequest alloc] initWithType:type]];
总结:
1.责任链设计模式使用的是非常广泛的,iOS中的事件响应机制也是此设计模式的应用。之前有个登录完后要弹多个协议,那时候拿if.else判断,也是搞的头痛不已。最大的好处就是使用的时候省去了判断,不用担心给谁处理。
2.设计模式也是程序员进阶的方向之一,作为一个老司机必备技能之一。
3.demo中的一、二章都是从<<设计模式之禅第2版.pdf>>中转过来的,有问题的地方欢迎留言交流。