Swift设计模式实践:行为型模式详解
前言
设计模式是软件开发中解决常见问题的可重用方案,行为型模式特别关注对象之间的通信和职责分配。本文将深入探讨Swift中实现的各种行为型设计模式,通过实际代码示例展示它们的应用场景和实现方式。
责任链模式(Chain Of Responsibility)
模式概念
责任链模式允许你将请求沿着处理链传递,直到有一个对象能够处理它为止。这种模式解耦了请求发送者和接收者,让多个对象都有机会处理请求。
Swift实现分析
示例中模拟了ATM取款机的钞票分配机制:
- 定义了
Withdrawing
协议作为处理链的基础 - 创建了
MoneyPile
类表示不同面值的钞票堆 ATM
类作为责任链的入口点
// 创建责任链:10<20<50<100
let ten = MoneyPile(value: 10, quantity: 6, next: nil)
let twenty = MoneyPile(value: 20, quantity: 2, next: ten)
// ...
实际应用场景
- 事件处理系统
- 审批流程
- 异常处理链
命令模式(Command)
模式概念
将请求封装为对象,使你可以参数化客户端请求,队列或日志请求,并支持可撤销操作。
Swift实现特点
示例中模拟了门禁控制系统:
- 定义了
DoorCommand
协议 - 实现了具体命令
OpenCommand
和CloseCommand
HAL9000DoorsOperations
作为调用者
let doorModule = HAL9000DoorsOperations(doors:"Pod Bay Doors")
doorModule.open() // 执行开门命令
优势
- 将调用操作的对象与知道如何执行操作的对象解耦
- 支持命令队列和日志
- 容易实现撤销/重做功能
解释器模式(Interpreter)
模式概念
给定一种语言,定义它的文法的一种表示,并定义一个解释器来解释语言中的句子。
Swift实现解析
示例中创建了一个简单的变量和加法表达式解释器:
IntegerExpression
协议定义了表达式接口IntegerContext
保存变量值- 实现了变量表达式和加法表达式
var expression = AddExpression(op1: a, op2: AddExpression(op1: b, op2: c))
var result = expression.evaluate(context) // 计算结果
适用场景
- 需要解释执行的语言或规则
- SQL解析
- 正则表达式处理
迭代器模式(Iterator)
模式概念
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
Swift原生支持
Swift通过IteratorProtocol
和Sequence
协议原生支持迭代器模式:
for novella in greatNovellas {
print("I've read: \(novella)")
}
实现要点
- 定义
IteratorProtocol
实现 - 让集合类型遵循
Sequence
协议 - 实现
makeIterator()
方法
中介者模式(Mediator)
模式概念
用一个中介对象来封装一系列对象交互,减少对象间直接引用。
示例分析
消息中介者实现:
- 定义了
Receiver
和Sender
协议 MessageMediator
作为中介者管理消息分发Programmer
作为接收者
let messagesMediator = MessageMediator()
messagesMediator.add(recipient: user0)
messagesMediator.send(message: "Hello")
优点
- 减少对象间耦合
- 集中控制交互逻辑
- 简化对象协议
备忘录模式(Memento)
模式概念
在不破坏封装性的前提下,捕获对象内部状态并在对象外部保存,以便后续恢复。
Swift实现技巧
示例中实现了游戏状态保存:
- 使用
Memento
类型别名表示状态 MementoConvertible
协议定义转换方法CheckPoint
作为管理者处理存储
CheckPoint.save(gameState, saveName: "gameState1")
let restored = GameState(memento: memento)
应用场景
- 游戏存档
- 事务回滚
- 撤销操作
观察者模式(Observer)
模式概念
定义对象间一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知。
Swift实现方式
示例中属性观察的实现:
PropertyObserver
协议定义观察方法TestChambers
作为被观察对象- 使用
willSet
和didSet
触发通知
testChambers.testChamberNumber += 1 // 触发观察者回调
对比Swift原生功能
Swift本身提供了didSet
/willSet
属性观察器,但观察者模式提供了更灵活的跨对象观察能力。
状态模式(State)
模式概念
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
示例解析
用户授权状态管理:
State
协议定义状态接口- 实现了
AuthorizedState
和UnauthorizedState
Context
维护当前状态
userContext.changeStateToAuthorized(userId: "admin")
优势
- 局部化状态相关行为
- 状态转换显式化
- 减少条件判断
策略模式(Strategy)
模式概念
定义一系列算法,封装每个算法,并使它们可以互相替换。
示例分析
仿生人测试策略:
RealnessTesting
协议定义测试策略- 实现了
VoightKampffTest
和GeneticTest
BladeRunner
作为上下文使用策略
let deckard = BladeRunner(test: VoightKampffTest())
let isAndroid = deckard.testIfAndroid(rachel)
适用场景
- 多种算法变体
- 需要动态切换算法
- 复杂条件语句的替代
模板方法模式
模式概念
在父类/协议中定义算法框架,允许子类重写特定步骤而不改变结构。
Swift实现特点
示例中的花园准备流程:
Garden
协议定义算法步骤- 协议扩展提供默认实现
RoseGarden
提供具体实现
roseGarden.prepare() // 执行模板方法
优势
- 代码复用
- 反向控制结构
- 符合开闭原则
访问者模式(Visitor)
模式概念
表示一个作用于某对象结构中各元素的操作,使你可以在不改变元素类的前提下定义新操作。
示例解析
星球访问者实现:
PlanetVisitor
协议定义访问接口- 各种星球实现
Planet
协议 NameVisitor
实现具体访问逻辑
planet.accept(visitor: visitor) // 接受访问
双分派机制
访问者模式利用Swift的多态特性实现了双分派:
- 元素接受访问者
- 访问者访问具体元素类型
总结
行为型设计模式为Swift开发者提供了强大的工具来解决对象间交互的复杂问题。通过合理应用这些模式,可以创建出更灵活、更易维护的代码结构。每种模式都有其适用场景,理解它们的核心思想和实现方式,才能在适当的时候选择最合适的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考