第十二篇:Objective-C 知识回顾设计模式之二

12.1.责任链模式

第十二篇:Objective-C 知识回顾设计模式之二_第1张图片
需求变更问题
问题一: 请看上图,如果面对这种容易改变的业务流程,比如原本 A B C 按顺序处理的流程,变成了 C B A 处理流程。面对这种容易变的情况,我们怎么从代码设计上来解决(具体例子,比如钉钉请假审核流程,审批人一般顺序是组长 HR CTO CEO,怎么样设计才能容易变换流程呢)?
问题二:责任链模式是什么?
  • 责任链模式就是为一个事件(责任),创建一条处理者对象链条;
  • 这条链条上的每个对象都可以处理此事件,并且这个链条上的每个处理者都拥有下一个处理者的引用;
  • 事件沿着链条传递,如果当前处理者可以处理事件,就处理并返回结果;
  • 如果当前处理者不能处理事件,则利用引用沿着链条传递给下一个处理者,直到有对象处理完毕。
  • 最终如果没人处理,则返回未处理的结果;
问题三: 为什么要使用责任链模式?
  • 解耦请求的发送者和接收者。
  • 链内成员可以灵活增删调顺序。
  • 有多个对象可以处理同一个请求,可以动态的确定谁来处理事件。
问题四: 怎么用责任链模式?
  • iOS 的事件响应者链条,就是一个责任链的应用的例子。
  • 下面代码也是经典的责任链模式代码。
// People.h文件
#import 
@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.桥接模式

第十二篇:Objective-C 知识回顾设计模式之二_第2张图片
业务解耦问题
问题一: 请看上图,如果有一个列表页面,它由于版本迭代的原因,需要共存三套网络数据,根据后端的需求的做对应的三种展示。请你来设计代码结构,如何才能解决列表和多套数据的耦合问题呢?
问题二: 桥接(Bridge)模式是什么?
  • 桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更
  • 抽象层次定义了供客户端使用的上层抽象接口
  • 实现层次定义了供抽象层使用的底层接口
  • 实现类的引用被封装于抽象层的实例中
  • 这样桥接就形成了
第十二篇:Objective-C 知识回顾设计模式之二_第3张图片
桥接的类构成
问题三: 为什么需要桥接(Bridge)模式?
  • 在实现层会出现多个角度的变化,每种角度都可能变化的情况下,使用桥接模式,可以进行灵活的扩展。
问题四: 如何使用桥接(Bridge)模式?
第十二篇:Objective-C 知识回顾设计模式之二_第4张图片
桥接模式的目录接口和关键代码

12.3.适配器设计模式

问题一: 如果说现在有一个古董类,在项目里面稳定运行了两年都未修改过,现在要你对该类做一些功能的扩展,你会怎么做?
问题二: 什么是适配器?
  • 用于连接两种或者两种以上不同种类的对象,使其毫无问题地协同工作。
  • 是的原来由于接口不兼容而不能一起工作的那些类,可以在一起工作。
  • 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用,类库迁移等方面非常有用。
  • 有类适配器和对象适配器两种。

12.4.单例设计模式

第十二篇:Objective-C 知识回顾设计模式之二_第5张图片
单例模式注意点

你可能感兴趣的:(第十二篇:Objective-C 知识回顾设计模式之二)