Swift 中的适配器模式和备忘录模式是什么?


在本文中,您将了解 Swift 语言中的这两种模式。此外,您还将了解使用这些模式的优势。您将看到如何在项目中采用这些模式的示例。

使用适配器模式,您可以设计一个系统,使两个不同的接口能够协同工作或彼此通信。您可以通过类或结构体遵循某个协议来实现此设计模式。然后,您可以使用该类或结构体的实例与遵循不同协议的对象进行交互。

使用备忘录模式,您可以设计一个系统,使对象能够恢复到以前的状态。您可以通过可以存储对象状态的类或结构体来实现此设计模式。为了管理存储,您需要创建存储和恢复状态的方法。

这两种设计模式都用于通过解耦对象来使您的代码更灵活和可重用。

适配器模式

当存在提供特定功能的现有类或结构体时,就会使用适配器模式。但是,您必须以与其当前接口不兼容的方式使用它。适配器类或结构体充当它们之间的桥梁,使现有类或结构体和新接口能够和谐共存。

考虑您已经有一个提供项目列表的类的案例。但是,该类并非旨在与 iOS 中的表格视图一起使用。您可以开发一个符合 UITableViewDataSource 协议的适配器类,以便将该类与表格视图一起使用。为了为表格视图提供数据,此适配器类依赖于现有类。

示例

以下是 Swift 中适配器模式的示例

protocol LegacyData {
   func getData() -> [String]
}
class LegacyDataProvider: LegacyData {
   func getData() -> [String] {
      return ["item1", "item2", "item3"]
   }
}
protocol NewData {
   func getData() -> [String]
}
class NewDataAdapter: NewData {
   private let legacyData: LegacyData
    
   init(legacyData: LegacyData) {
      self.legacyData = legacyData
   }
   
   func getData() -> [String] {
      return legacyData.getData()
   }
}
let legacyDataProvider = LegacyDataProvider()
let newDataAdapter = NewDataAdapter(legacyData: legacyDataProvider)
print(newDataAdapter.getData())

输出

["item1", "item2", "item3"]

在这里,LegacyDataProvider 是一个提供特定格式数据的现有类,但它与 NewData 协议定义的新接口不兼容。NewDataAdapter 类充当两者之间的桥梁,允许将 LegacyDataProvider 与新接口一起使用。

使用适配器模式的一些优势包括

  • 它允许集成不兼容的类

  • 它允许分离接口和实现

  • 它允许重用现有类

  • 它允许轻松添加新类

备忘录模式

当需要保存对象的状​​态以便以后可以恢复时,就会使用备忘录模式。对象的状​​态存储在 Memento 类或结构体中,它提供生成、恢复和访问备忘录的方法。

例如,考虑您正在构建一个绘图应用程序并且想要允许用户撤消和重做其操作的场景。您可以使用备忘录模式在每个步骤中存储绘图画布的状态,以便用户可以轻松地撤消和重做其操作。

示例

以下是 Swift 中备忘录模式的示例

class DrawingCanvas {   
   private var shapes: [Shape] = []
    
   func addShape(_ shape: Shape) {
      shapes.append(shape)
   }    
   func undo() -> [Shape] {
      return Memento.undo(from: &shapes)
   }  
   func redo() -> [Shape] {
      return Memento.redo(from: &shapes)
   }   
   func save() {
      Memento.save(from: shapes)
   }   
   private struct Memento {
      private static var undoStack: [[Shape]] = []
      private static var redoStack: [[Shape]] = []
        
      static func undo(from shapes: inout [Shape]) -> [Shape] {
         guard !undoStack.isEmpty else { return [] }
         let currentState = undoStack.removeLast()
         redoStack.append(shapes)
         return currentState
      }
        
      static func redo(from shapes: inout [Shape]) -> [Shape] {
         guard !redoStack.isEmpty else { return [] }
         let currentState = redoStack.removeLast()
         undoStack.append(shapes)
         return currentState
      }
        
      static func save(from shapes: [Shape]) {
         undoStack.append(shapes)
         redoStack.removeAll()
      }
   }   
   struct Shape {
        
   }
}

在这里,DrawingCanvas 类具有一个私有的备忘录属性,它是 Memento 结构体的实例。此属性负责在每个步骤中保存 DrawingCanvas 类的状态。DrawingCanvas 具有撤消和重做方法,这些方法使用备忘录的撤消和重做方法来恢复画布的状态。

使用备忘录模式的一些优势包括

  • 它允许撤消和重做操作

  • 它允许轻松保存和恢复对象的状​​态

  • 它允许解耦对象及其状态

  • 它允许关注点分离

结论

适配器模式和备忘录模式是两种可以帮助开发人员解决软件开发中常见问题的模式。适配器模式允许具有不兼容接口的对象协同工作,而备忘录模式允许对象保存和恢复其以前的状态。这两种模式都鼓励松耦合和关注点分离,并且可以帮助您创建设计更有效的代码。了解何时以及如何在代码库中正确应用这些模式至关重要。

更新于: 2023年2月28日

267 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.