Design Patterns on iOS using Swift – Part 1/2
Design Patterns on iOS using Swift – Part 2/2
在开发此应用程序的过程中,您将熟悉最常见的Cocoa
设计模式:
- 创建型 (
Creational
):单例模式 (Singleton
)- 结构型 (
Structural
):MVC
、装饰者模式 (Decorator
)、适配器模式 (Adapter
)、外观模式 (Facade
)- 行为型 (
Behavioral
):观察者模式 (Observer
)、备忘录模式 (Memento
)
设计模式之王 – MVC
Model-View-Controller
(MVC)是Cocoa
的构建块之一,无疑是最常用的设计模式。它根据对象在应用程序中的角色(role
)对对象
进行分类,并鼓励基于角色(role
)的代码清晰分离。
这三个角色是:
model:
保存应用程序(application
)数据的对象,并定义如何操作它。例如,在您的应用程序(application
)中,Model
是Album
结构,您可以在Album.swift
中找到它。大多数应用程序将有多个类型作为其模型的一部分View:
负责model
的可视化表示的对象和用户可以与之交互的控件;基本上,所有UIView派生
的对象。在您的应用程序中,View
由AlbumView
表示,您可以在AlbumView.swift
中找到它。ViewController:
控制器是协调所有工作的中介。它访问model
中的数据并将其用view
显示,监听事件并根据需要操作数据。你能猜出哪个class
是你的controller
吗?那是对的:ViewController
。
通过Controller
可以最好地描述View
到Model
之间的通信,如下图所示:
单例模式
final class LibraryAPI {
// 1
static let shared = LibraryAPI()
// 2
private init() {
}
}
复制代码
避免滥用单例
1. 全局状态
// 一个单例可以被使用在任何地方,而不需要显式地声明依赖。主要是用在测试里面,需要格外注意测试的顺序
2. 对象的生命周期
// 单例应该只用来保存全局的状态,并且不能和任何作用域绑定。如果这些状态的作用域比一个完整的应用程序的生命周期要短,那么这个状态就不应该使用单例来管理。
复制代码
在不可避免使用单例的情况,应当考虑使用单例plus
, 即对象仍然可以自己创建实例对象
外观模式 (The Facade Design Pattern)
**外观(Facade
)设计模式:**为复杂子系统提供单一接口(interface
),您只需公开一个简单的统一API
,而不是暴露给使用者一组classes
及其APIs
。
使用场景:
组件化时候,module
内进行统一的API
抽取,或者引用第三方库的时候,可以进行一层基于API
的封装。在比如SDWebimage
或者kingfisher
中加载网络图片的使用。都是使用者不需要知道内部的逻辑的调用方式。
下面这张图解释了这个概念:
API
的使用者完全不需要知道API
内部的复杂性。当使用大量类时,这种模式是理想的,特别是当它们使用起来复杂或难以理解时
装饰者模式(The Decorator Design Pattern)
**装饰者(Decorator
)模式:**动态地向对象添加行为(behaviors
)和职责(responsibilities
)而无需修改其代码。它是子类化的替代方法,通过用另一个对象包装它来修改类的行为。
在Swift中,这种模式有两种非常常见的实现:Extensions
和 Delegation
Extensions
添加扩展是一种非常强大的机制,允许您向现有类
,结构体
或枚举
类型添加新功能,而无需子类。更令人惊叹的,你可以扩展你无法访问的代码,并增强他们的功能。这意味着你可以将自己的方法添加到Cocoa
类,如UIView
和UIImage
!
注意:
类当然可以覆盖父类的方法,但是使用扩展时不能。扩展中的方法或属性不能与原始类中的方法或属性同名。
Delegation
Decorator设计模式的另一个实现是委托(delegate
),它是一种机制,其中一个对象代表另一个对象或与另一个对象协同工作。
适配器模式(The Adapter Pattern)
适配器(Adapter
)允许具有不兼容接口的类一起工作。它将自身包裹在一个对象周围,并公开一个标准接口以与该对象进行交互。
如果您熟悉适配器模式,那么您会注意到Apple
以稍微不同的方式实现它 — Apple
使用协议(protocols
)来完成工作。您可能熟悉UITableViewDelegate
,UIScrollViewDelegate
,NSCoding
和NSCopying
等协议。例如,使用NSCopying
协议,任何类都可以提供标准的复制方法。
观察者模式
在Observer
模式中,一个对象通知其他对象任何状态更改。所涉及的对象不需要彼此了解 – 从而鼓励分离设计。此属性最常用于在属性发生更改时通知感兴趣的对象。
通常的实现要求观察者注册对另一个对象的状态的兴趣。当状态改变时,所有观察对象都被通知该改变。
Cocoa以两种方式实现观察者模式:Notifications
和 Key-Value Observing (KVO)
工厂模式(The Memento Pattern)
类簇
备忘录模式(The Memento Pattern)
**备忘录模式:
**捕获并外化对象的内部状态。换句话说,它可以在某处保存你的东西。稍后,可以在不违反封装的情况下恢复此外部化状态;也就是说,私人数据仍然是私有的。