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.