用于多平台开发的模块化体系结构:第2部分
这是3部分系列的第二部分。 您可以在这里找到其他部分:
第1部分:简介和设置
第3部分:演示和UI
配套项目: Github
接口
正如我们一开始提到的,该项目的目标之一就是创建一个模块化的体系结构。 模块必须能够与他人对话,而且必须松散耦合,以使体系结构保持软性,灵活性和适应变化的能力。 例如,如果我们决定将ShowEngine
实现更改为依赖于其他图像提供程序,则它不应影响任何其他模块。
我们可以通过协议或闭包来实现。 对于这个项目,我想要一个更具描述性的解决方案,因此我选择了协议。
让我们在ShowEngine
类中实现协议接口。 考虑创建接口的简单方法是输入/输出。 ShowEngineInput
协议定义了模块与ShowEngineOutput
进行对话的所有方式, ShowEngineOutput
协议定义了与其他模块进行对话的所有方式。 我们希望其他人能够start
和stop
ShowEngine
。 我们希望其他人被告知imageLoadSuccess
和imageLoadFailure
:
注意,我们通过:AnyObject
关键字将协议采用仅限于类。 从Swift.org文档中:
当该协议的要求定义的行为假定或要求符合类型具有引用语义而不是值语义时,请使用仅类协议。
定义好接口后,让ViewControllers
和InterfaceController
符合它。 请注意,我们将ShowEngine
属性声明为weak
以解析强引用。
工厂和作曲家
我们不能简单地在每个ViewController
和InterfaceController
组成ShowEngine
,因为那样会创建强大的参考。 解决方案是使用Factory和Composite模式。 这些将成为我们Main
模块的一部分:
工厂组成
我们在AppDelegate
实例化ShowEngineUseCaseFactory
,将ViewController
的实例作为输出,并使用属性注入分配ShowEngine
用例实例。
界面已完成。 使用定义明确的模块,我们现在可以分手工作。 我们可以有一个团队在框架实现上工作,而一个或几个团队可以在SlideShow
实现上工作。 该工作可以并行进行。 只要每个人都遵守已定义的界面,就可以全力以赴!