基于策略模式设计的文件上传组件

本文大约1150字,将会简单讲述基于策略模式设计的文件上传组件的一些设计思路以及使用方式。

!!!原创文章,转载请注明来源: pany.fun

本文相关Demo: PZFileUploader

Demo中仅实现了整体框架,部分诸如 token请求过程、请求返回的数据解析过程 等需自行根据实际业务场景实现

#文件上传需求

文件上传功能是大多数项目都会涉及到的,在我司项目中,文件上传功能有一下几个痛点

  • 上传类型多,图片(头像、识别)、音频、视频、通讯录、日志 等等
  • 不同类型文件有不同上传方式,如:通讯录、日志上传到自己服务器,媒体文件上传七牛
  • 不同类型文件请求七牛token时有不同参数要求(如头像需要单独标记)
  • 不同类型文件上传时带参数可能不同
  • 不同类型文件上传以后返回的json数据结构不同(历史问题)
  • 文件类型随时可能扩展

这些问题导致我司的文件上传组件耦合越来越严重,维护成本越来越高

#以传统思路看问题所在

按照传统的思路,我们可能这样设计上传功能

// 设计一个枚举,用来标识不同的上传文件的类型
typedef enum : NSUInteger {
    FileType_Image,
    FileType_Video,
    FileType_Log,
} FileType;

// token的Url
- (NSString *)tokenUrlWithType:(FileType)type {
    NSString *urlStr;
    switch (type) {
        case FileType_Image:
            urlStr = @"xxxxx1";
            break;
        case FileType_Video:
            urlStr = @"xxxxx2";
            break;
        case FileType_Log:
            urlStr = @"xxxxx3";
            break;
    }
    return urlStr;
}

// 请求的参数
- (NSDictionary *)paramsWithType:(FileType)type {
    switch (type) {
        case FileType_Image:
            return xxx1;
            break;
        case FileType_Video:
            return xxx2;
            break;
        case FileType_Log:
            return xxx3;
            break;
    }
}

// ......

首先我们会设计一个枚举,标识不同类型的文件

随后,为了应对各种场景,例如不同文件 上传到哪里、请求token的url、请求token的参数 等等,我们需要不断的进行类型的判断

这无疑会导致我们有大量的判断需要写,开发工作繁杂。而且一旦后期增加一种上传类型,就会需要添加枚举,需要添加所有的条件判断,维护成本极高。而且这种写法很难作为多app平台的独立组件使用,它的一些逻辑已经深入到了需求细节,耦合度高。

#PZFileUploader的设计思路

在前面策略模式的文章中,我明们已经提到了策略模式的抽象思想,这里我们直接应用。具体代码可以直接查看PZFileUploaderDemo

首先,我们按照策略模式的抽象思路,摒弃了枚举,并以类代替,然后在基类PZFileTypeBase中提供了上传过程中各个流程的默认实现,并对外开放了两大主要流程——上传流程 和 token请求流程,以满足子类的自定义需求,子类只需要继承并覆盖对应方法就可以实现流程细节的自定义。

另外独立于上传,还单独设计了token池的功能,用于处理次token请求返回多个token的业务场景,为不同的文件类型维护独立的token池。

#PZFileUploader怎么用

- 基本使用方式

PZFileUploader主要需要关注的类有两个

  • PZFileUploader

    这是上传工具主类,以单例形式提供,包含了外部上传文件需要调用的主接口以及token请求的url配置接口

  • PZFileTypeBase

    用于区分上传的文件类型的基类,其内部已经实现了上传的主要流程,其upload接口提供给PZFileUploader调用。

上传文件时,调用PZFileUploader中的upload接口,并传入相应文件和type实例

- 如何添加文件类型支持

当需要添加新的上传文件类型时,非常的简单,只需要新建一个type类并继承到PZFileTypeBase即可

- 如何自定义token请求流程/上传流程

在自己的type子类中重写- requestToken:方法即可自定义token请求流程,token请求所需的参数可以作为type的属性。参考 PZFileTypeVideo.m

在自己的type子类中重写- upload:withParams:方法即可自定义上传流程以及上传完成后的数据解析。参考 PZFileTypeCrashLog.m

- 文件组织建议

为了达到高度解耦以及新平台的易移植特性,建议将PZFileUploader类、PZUploadToken类、PZFileTypeBase类作为平台型中间件以方便新app的快速移植,而其它的PZFileTypeBase的子类,作为业务型中间件,以满足更加贴合业务需求的上传功能。

创作不易,转载请注明来源!pany.fun
本文链接:http://pany.fun/post/基于策略模式设计的文件上传组件/