应用技术
设计模式

设计模式

一、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 双向绑定。

优点:

减少控制器逻辑,易测试、可复用性更高。

缺点:

增加复杂度,数据绑定调试困难。

常见实现:

  • 使用 KVOReactiveCocoaCombineRxSwift 实现双向绑定。
  • 例如 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 里的实战示例集」?