美文网首页iOS 开发 Objective-C
第十二篇:Objective-C 知识回顾设计模式之二

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

作者: 望穿秋水小作坊 | 来源:发表于2019-12-04 16:50 被阅读0次

    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.单例设计模式

    单例模式注意点

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/kxykgctx.html