设计模式 - 命令模式&中介者模式&组合模式~AppDelegate 解耦

前言 Hi Coder,我是 CoderStar! 今天主要给大家分享的内容是三种设计模式 (命令模式、中介者模式以及组合模式) 及其它们在 AppDelegate 解耦场景下的应用,特别是组合模式,沉淀出相应的轮子分享给大家。 同时也给大家说下后面关于设计模式系列的文章计划,因为设计模式相关文章会结合我们开发中实际上会遇到的场景进行整理,所以发文可能不连续,希望大家理解,我会将大部分设计模式的代码示例全部整理到 DesignPatternsDemo 仓库中,形式为 Playground,所以代码示例中可能会有一些手动调用系统函数的情况出现。 同时给大家推荐一个学习设计模式的好网站 –深入设计模式,文章中涉及的部分 UML 图也来自该网站。 场景 AppDelegate 是应用程序的根对象,即唯一代理,可以认为是每个 iOS 项目的核心。 其提供应用程序生命周期事件的暴露; 其确保应用程序与系统以及其他应用程序正确的交互; 其通常承担很多职责,这使得很难进行更改,扩展和测试。 随着业务的迭代升级,不断增加新的功能和业务,AppDelegate 中的代码量也不断增长,致使其 Massive。AppDelegate 中常见的业务会包括: 生命周期中的事件处理及传播; 管理 UI 堆栈配置:选择初始视图控制器,执行根视图控制器转换; 管理后台任务; 管理通知; 三方库初始化; 管理设备方向; 设置 UIAppearance; … 并且因为 AppDelegate 会影响整个 APP,所以在面对复杂的 AppDelegate 时,我们就会小心翼翼,生怕自己自己的改动影响到其他的功能。所以说 AppDelegate 的简洁和清晰对于健康的 iOS 架构来说是至关重要的。 下面我们利用上述三种设计模式实现对 AppDelegate 的解耦,使其优雅。 命令模式 命令模式(Command) 是一种 行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。 UML <!DOCTYPE html> Responsive Image ...

November 18, 2024 · 5 min · 1052 words · CoderStar

设计模式-责任链模式&策略模式~扫码场景下的落地

前言 Hi Coder,我是 CoderStar! 今天主要是给大家分享一下两种设计模式,即责任链模式以及策略模式。至于为什么想着给大家分享这两种设计模式呢,这源于我之前对扫码场景的相关代码优化,下面我将结合我遇到这个的场景给大家讲一下这两种设计模式。 顺便我也表达一点我对设计模式的看法,设计模式需要结合一定的使用场景才会体现才会它的妙处,大家在平时在开发时觉得哪些地方的代码不简洁优雅,都可以思考一下应用哪种设计模式可以对其进行优化、解耦,但也需要注意,不要对设计模式生搬硬套。 同时本篇文章也将是设计模式系列的开篇作了,后面也会慢慢给大家介绍其他的设计模式及其应用的场景。 场景及一般实现 有一个场景,想必大家都遇到过,就是扫描不同的二维码根据扫描结果跳转进入到不同的功能页面,如登录、加好友等等。我们拿到结果后需要对内容进行校验,是否是我们需要的信息,然后做一些特殊的处理。比如先判断是不是一个 url 链接,是则打开这个链接,不是的话进行下一种判断,比如是否是项目中的约定的跳转某个功能的信息… 依次下去。 因代码篇幅,后面代码示例也只体现登录、加好友两个 case。 普通的写法便是通过 if-else 或者 switch-case 对条件进行判断继而执行不同的分支。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func onScanResult(type: String) { switch type { case "login": // TODO 登录的相关逻辑 case "addContacts" // TODO 添加联系人的相关逻辑 // 此处省略99种分支判断 ... default: break } } 上述示例逻辑相对简单,可推理到业务,有可能登录、添加联系人内部逻辑都很复杂,并且还有可能分支判断不是简单的根据 type 来判断,而是根据很多条件综合来判断。 ...

November 16, 2024 · 4 min · 665 words · CoderStar