12.1.责任链模式
需求变更问题
问题一: 请看上图,如果面对这种容易改变的业务流程,比如原本 A B C 按顺序处理的流程,变成了 C B A 处理流程。面对这种容易变的情况,我们怎么从代码设计上来解决(具体例子,比如钉钉请假审核流程,审批人一般顺序是组长 HR CTO CEO,怎么样设计才能容易变换流程呢)?
问题二:责任链模式是什么?
- 责任链模式就是为一个事件(责任),创建一条处理者对象链条;
- 这条链条上的每个对象都可以处理此事件,并且这个链条上的每个处理者都拥有下一个处理者的引用;
- 事件沿着链条传递,如果当前处理者可以处理事件,就处理并返回结果;
- 如果当前处理者不能处理事件,则利用引用沿着链条传递给下一个处理者,直到有对象处理完毕。
- 最终如果没人处理,则返回未处理的结果;
问题三: 为什么要使用责任链模式?
- 解耦请求的发送者和接收者。
- 链内成员可以灵活增删调顺序。
- 有多个对象可以处理同一个请求,可以动态的确定谁来处理事件。
问题四: 怎么用责任链模式?
- iOS 的事件响应者链条,就是一个责任链的应用的例子。
- 下面代码也是经典的责任链模式代码。
// People.h文件
#import <Foundation/Foundation.h>
@class People;
typedef void(^ResultBlock)(People *handler,BOOL handled);
typedef void(^CompletionBlock)(BOOL handled);
@interface People : NSObject
// 下一个响应者(响应者构成的关键)
@property (nonatomic, strong) People *nextHandler;
// 响应者的处理方法
- (void)handle:(NSString *)event resultBlock:(ResultBlock)result;
// 各个业务在该方法当中做实际业务处理
- (void)handleBussiness:(NSString *)event completionBlock:(CompletionBlock)completion;
@end
// People.m文件
#import "People.h"
@implementation People
- (void)handle:(NSString *)event resultBlock:(ResultBlock)result {
__weak typeof(self) weakSelf = self;
[self handleBussiness:event completionBlock:^(BOOL handled) {
if (handled) { // 当前类能处理
result(weakSelf, handled);
} else {
if (weakSelf.nextHandler) { // 当前类不能处理,并且责任链存在下一个响应者,就交给下一个响应者处理.
[weakSelf.nextHandler handle:event resultBlock:result];
} else { // 没人可以处理这个事件
result(nil, NO);
}
}
}];
}
- (void)handleBussiness:(NSString *)event completionBlock:(CompletionBlock)completion {
NSLog(@"根据各个业务具体要求,重写并且处理事件");
if (completion) {
completion(NO);
}
}
@end
12.2.桥接模式
业务解耦问题
问题一: 请看上图,如果有一个列表页面,它由于版本迭代的原因,需要共存三套网络数据,根据后端的需求的做对应的三种展示。请你来设计代码结构,如何才能解决列表和多套数据的耦合问题呢?
问题二: 桥接(Bridge)模式是什么?
- 桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更
- 抽象层次定义了供客户端使用的上层抽象接口
- 实现层次定义了供抽象层使用的底层接口
- 实现类的引用被封装于抽象层的实例中
- 这样桥接就形成了
桥接的类构成
问题三: 为什么需要桥接(Bridge)模式?
- 在实现层会出现多个角度的变化,每种角度都可能变化的情况下,使用桥接模式,可以进行灵活的扩展。
问题四: 如何使用桥接(Bridge)模式?
桥接模式的目录接口和关键代码
12.3.适配器设计模式
问题一: 如果说现在有一个古董类,在项目里面稳定运行了两年都未修改过,现在要你对该类做一些功能的扩展,你会怎么做?
问题二: 什么是适配器?
- 用于连接两种或者两种以上不同种类的对象,使其毫无问题地协同工作。
- 是的原来由于接口不兼容而不能一起工作的那些类,可以在一起工作。
- 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用,类库迁移等方面非常有用。
- 有类适配器和对象适配器两种。
12.4.单例设计模式
单例模式注意点
网友评论