iOS必备设计模式-责任链
2019-05-07 本文已影响0人
MR_詹
设计模式-责任链
作用:
- 解耦消息的发送者和接送者
- 让多个对象有机会处理某个请求(比如:流式业务流程(OA))
实现:
- 为某个请求创建一个对象链,每个对象依次检查次请求并对其进行处理,或者将它传递给链中的下一个对象
- 链的实现:使用现成的链(如继承关系)或者自己实现新联(next指针)
- 链上的每个对象都采用同样的接口处理或者上抛事件
实例:

创建基础的链对象
#import <Foundation/Foundation.h>
@class BusinessObject;
typedef void (^CompletionBlock)(BOOL handled);
typedef void (^ResultBlock)(BusinessObject *handler,BOOL handled);
@interface BusinessObject : NSObject
/* 下一个响应者(响应链构成的关键) **/
@property (nonatomic, strong, readwrite) BusinessObject *nextBusiness;
/* 响应者的处理方法 **/
- (void)handle:(ResultBlock)result;
/* 各个业务在该方法当中做实际业务处理 **/
- (void)handleBusiness:(CompletionBlock)completion;
@end
#import "BusinessObject.h"
@implementation BusinessObject
/* 响应者的处理方法 **/
- (void)handle:(ResultBlock)result
{
CompletionBlock completion = ^(BOOL handled) {
// 当前业务处理掉,上抛结果
if (handled) {
result(self,handled);
}
else{
// 沿着责任链,指派给下一个业务处理
if (self.nextBusiness) {
[self.nextBusiness handle:result];
}
else{
// 没有业务处理,上抛
result(nil,NO);
}
}
};
// 当前业务请求
[self handleBusiness:completion];
}
/* 各个业务在该方法当中做实际业务处理 **/
- (void)handleBusiness:(CompletionBlock)completion
{
/*
业务逻辑处理
如网络请求、本地照片查询等
*/
}
@end
新建三个类,都继承于基础类BusinessObject,并重写handleBusiness方法,实现对应的业务
#import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessObjectA : BusinessObject
@end
NS_ASSUME_NONNULL_END
#import "BusinessObjectA.h"
@implementation BusinessObjectA
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"执行A业务");
completion(NO);
}
@end
修改前的业务流:a-b-c
image.png
修改后的业务流:c-b-a
image.png