设计模式
一、MVC(Model–View–Controller)
概念:
MVC 是 iOS 最经典的架构模式,苹果官方推荐。
- Model(模型层):负责数据、业务逻辑。
- View(视图层):负责 UI 展示。
- Controller(控制器层):连接 Model 与 View,协调二者交互。
优点:
结构清晰、职责分明、开发效率高。
缺点:
控制器容易臃肿(俗称 Massive View Controller)。
典型应用:
UIKit 框架大量使用,如 UIViewController 管理 UIView 与数据模型。
二、MVVM(Model–View–ViewModel)
概念:
MVVM 在 MVC 基础上演化,通过 ViewModel 层减少 Controller 负担。
- ViewModel 负责处理业务逻辑、数据转换,并与 View 双向绑定。
优点:
减少控制器逻辑,易测试、可复用性更高。
缺点:
增加复杂度,数据绑定调试困难。
常见实现:
- 使用 KVO、ReactiveCocoa、Combine 或 RxSwift 实现双向绑定。
- 例如 SwiftUI 天然是 MVVM 模式。
三、MVP(Model–View–Presenter)
概念:
- Presenter 负责业务逻辑与数据处理。
- View 只负责展示,通过接口与 Presenter 通信。
优点:
Controller 职责进一步减轻,可单元测试。
缺点:
接口定义较多,代码量上升。
区别于 MVVM:
MVVM 偏向“数据绑定”,MVP 偏向“接口回调”。
四、单例模式(Singleton)
概念:
整个程序中只存在一个对象实例。
使用场景:
-
用户配置、缓存管理、网络层、数据库访问。
示例:
class NetworkManager {
static let shared = NetworkManager()
private init() {}
}注意:
避免滥用,可能导致测试困难和状态不一致。
五、代理模式(Delegate)
概念:
对象 A 把部分行为委托给对象 B,实现解耦。
使用场景:
UITableViewDelegate、UITextFieldDelegate 等系统广泛使用。
示例:
protocol CustomViewDelegate: AnyObject {
func buttonTapped()
}
class CustomView {
weak var delegate: CustomViewDelegate?
func tapButton() {
delegate?.buttonTapped()
}
}六、观察者模式(Observer)
概念:
对象间一对多关系,当一个对象状态改变时,自动通知其他对象。
实现方式:
- NotificationCenter
- KVO
- Combine / RxSwift
示例:
NotificationCenter.default.addObserver(self,
selector: #selector(updateUI),
name: .userDidLogin,
object: nil)七、工厂模式(Factory)
概念:
将对象创建逻辑封装在工厂中,根据条件返回不同类型对象。
示例:
protocol Shape {}
class Circle: Shape {}
class Square: Shape {}
class ShapeFactory {
static func createShape(type: String) -> Shape {
switch type {
case "circle": return Circle()
case "square": return Square()
default: fatalError("Unknown shape")
}
}
}使用场景:
UI组件封装、服务对象创建、模块注入。
八、适配器模式(Adapter)
概念:
将一个类的接口转换成客户端期望的接口,使原本接口不兼容的类协同工作。
示例:
将第三方日志库封装为统一 Logger 接口。
九、策略模式(Strategy)
概念:
将一组算法封装成独立类,使它们可相互替换。
示例:
不同加密算法、不同排序方式、不同支付逻辑等。
十、装饰器模式(Decorator)
概念:
动态地为对象添加新功能,而不改变原类结构。
示例:
对 UIView 扩展方法添加圆角、阴影等 UI 效果。
十一、命令模式(Command)
概念:
将请求封装为对象,使你可以用不同请求、队列或日志来参数化对象。
使用场景:
操作撤销、宏命令(如绘图应用的操作记录)。
十二、原型模式(Prototype)
概念:
通过复制现有对象创建新对象,而不是通过类实例化。
示例:
NSCopying 协议。
十三、外观模式(Facade)
概念:
为复杂系统提供一个统一接口,简化使用。
示例:
封装多个 SDK(登录、推送、埋点)统一对外暴露一个接口。
十四、依赖注入(Dependency Injection)
概念:
不在类中直接创建依赖对象,而是通过外部传入。
优点:
提高模块解耦性、可测试性更好。
示例:
class UserService {
private let api: APIClient
init(api: APIClient) {
self.api = api
}
}十五、建造者模式(Builder)
概念:
逐步构建复杂对象。
示例:
URLRequest 通过链式调用构造参数。
在 iOS 开发中,常用的核心模式主要集中于 MVC / MVVM 架构 + 单例 + 代理 + 观察者 + 工厂 + 外观 + 依赖注入。理解它们的**动机(解耦、可维护性、可扩展性)**远比死记代码更重要。
是否需要我接着输出一份「这些模式在 Swift 里的实战示例集」?