iOS 开发 Objective-C

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

2019-12-04  本文已影响0人  望穿秋水小作坊

12.1.责任链模式

需求变更问题
问题一: 请看上图,如果面对这种容易改变的业务流程,比如原本 A B C 按顺序处理的流程,变成了 C B A 处理流程。面对这种容易变的情况,我们怎么从代码设计上来解决(具体例子,比如钉钉请假审核流程,审批人一般顺序是组长 HR CTO CEO,怎么样设计才能容易变换流程呢)?
问题二:责任链模式是什么?
问题三: 为什么要使用责任链模式?
问题四: 怎么用责任链模式?
// 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.单例设计模式

单例模式注意点
上一篇 下一篇

猜你喜欢

热点阅读