Swift设计模式实践:行为型模式详解

Swift设计模式实践:行为型模式详解

Design-Patterns-In-Swift 📖 Design Patterns implemented in Swift 5.0 Design-Patterns-In-Swift 项目地址: https://gitcode.com/gh_mirrors/de/Design-Patterns-In-Swift

前言

设计模式是软件开发中解决常见问题的可重用方案,行为型模式特别关注对象之间的通信和职责分配。本文将深入探讨Swift中实现的各种行为型设计模式,通过实际代码示例展示它们的应用场景和实现方式。

责任链模式(Chain Of Responsibility)

模式概念

责任链模式允许你将请求沿着处理链传递,直到有一个对象能够处理它为止。这种模式解耦了请求发送者和接收者,让多个对象都有机会处理请求。

Swift实现分析

示例中模拟了ATM取款机的钞票分配机制:

  1. 定义了Withdrawing协议作为处理链的基础
  2. 创建了MoneyPile类表示不同面值的钞票堆
  3. 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实现特点

示例中模拟了门禁控制系统:

  1. 定义了DoorCommand协议
  2. 实现了具体命令OpenCommandCloseCommand
  3. HAL9000DoorsOperations作为调用者
let doorModule = HAL9000DoorsOperations(doors:"Pod Bay Doors")
doorModule.open()  // 执行开门命令

优势

  • 将调用操作的对象与知道如何执行操作的对象解耦
  • 支持命令队列和日志
  • 容易实现撤销/重做功能

解释器模式(Interpreter)

模式概念

给定一种语言,定义它的文法的一种表示,并定义一个解释器来解释语言中的句子。

Swift实现解析

示例中创建了一个简单的变量和加法表达式解释器:

  1. IntegerExpression协议定义了表达式接口
  2. IntegerContext保存变量值
  3. 实现了变量表达式和加法表达式
var expression = AddExpression(op1: a, op2: AddExpression(op1: b, op2: c))
var result = expression.evaluate(context)  // 计算结果

适用场景

  • 需要解释执行的语言或规则
  • SQL解析
  • 正则表达式处理

迭代器模式(Iterator)

模式概念

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。

Swift原生支持

Swift通过IteratorProtocolSequence协议原生支持迭代器模式:

for novella in greatNovellas {
    print("I've read: \(novella)")
}

实现要点

  1. 定义IteratorProtocol实现
  2. 让集合类型遵循Sequence协议
  3. 实现makeIterator()方法

中介者模式(Mediator)

模式概念

用一个中介对象来封装一系列对象交互,减少对象间直接引用。

示例分析

消息中介者实现:

  1. 定义了ReceiverSender协议
  2. MessageMediator作为中介者管理消息分发
  3. Programmer作为接收者
let messagesMediator = MessageMediator()
messagesMediator.add(recipient: user0)
messagesMediator.send(message: "Hello")

优点

  • 减少对象间耦合
  • 集中控制交互逻辑
  • 简化对象协议

备忘录模式(Memento)

模式概念

在不破坏封装性的前提下,捕获对象内部状态并在对象外部保存,以便后续恢复。

Swift实现技巧

示例中实现了游戏状态保存:

  1. 使用Memento类型别名表示状态
  2. MementoConvertible协议定义转换方法
  3. CheckPoint作为管理者处理存储
CheckPoint.save(gameState, saveName: "gameState1")
let restored = GameState(memento: memento)

应用场景

  • 游戏存档
  • 事务回滚
  • 撤销操作

观察者模式(Observer)

模式概念

定义对象间一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知。

Swift实现方式

示例中属性观察的实现:

  1. PropertyObserver协议定义观察方法
  2. TestChambers作为被观察对象
  3. 使用willSetdidSet触发通知
testChambers.testChamberNumber += 1  // 触发观察者回调

对比Swift原生功能

Swift本身提供了didSet/willSet属性观察器,但观察者模式提供了更灵活的跨对象观察能力。

状态模式(State)

模式概念

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

示例解析

用户授权状态管理:

  1. State协议定义状态接口
  2. 实现了AuthorizedStateUnauthorizedState
  3. Context维护当前状态
userContext.changeStateToAuthorized(userId: "admin")

优势

  • 局部化状态相关行为
  • 状态转换显式化
  • 减少条件判断

策略模式(Strategy)

模式概念

定义一系列算法,封装每个算法,并使它们可以互相替换。

示例分析

仿生人测试策略:

  1. RealnessTesting协议定义测试策略
  2. 实现了VoightKampffTestGeneticTest
  3. BladeRunner作为上下文使用策略
let deckard = BladeRunner(test: VoightKampffTest())
let isAndroid = deckard.testIfAndroid(rachel)

适用场景

  • 多种算法变体
  • 需要动态切换算法
  • 复杂条件语句的替代

模板方法模式

模式概念

在父类/协议中定义算法框架,允许子类重写特定步骤而不改变结构。

Swift实现特点

示例中的花园准备流程:

  1. Garden协议定义算法步骤
  2. 协议扩展提供默认实现
  3. RoseGarden提供具体实现
roseGarden.prepare()  // 执行模板方法

优势

  • 代码复用
  • 反向控制结构
  • 符合开闭原则

访问者模式(Visitor)

模式概念

表示一个作用于某对象结构中各元素的操作,使你可以在不改变元素类的前提下定义新操作。

示例解析

星球访问者实现:

  1. PlanetVisitor协议定义访问接口
  2. 各种星球实现Planet协议
  3. NameVisitor实现具体访问逻辑
planet.accept(visitor: visitor)  // 接受访问

双分派机制

访问者模式利用Swift的多态特性实现了双分派:

  1. 元素接受访问者
  2. 访问者访问具体元素类型

总结

行为型设计模式为Swift开发者提供了强大的工具来解决对象间交互的复杂问题。通过合理应用这些模式,可以创建出更灵活、更易维护的代码结构。每种模式都有其适用场景,理解它们的核心思想和实现方式,才能在适当的时候选择最合适的解决方案。

Design-Patterns-In-Swift 📖 Design Patterns implemented in Swift 5.0 Design-Patterns-In-Swift 项目地址: https://gitcode.com/gh_mirrors/de/Design-Patterns-In-Swift

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓朝昌Estra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值