Swift設計模式 – 代理模式(Proxy Pattern)

還記得上次介紹「觀察者設計模式」提到的Wood Bakery嗎?這次我們來看看他們的內部系統。

Wood Bakery除了每天會宣布一個Today’s Special以外,他們還有一個特色,每當有人下單,就會有一個人負責喊「10份草莓大福」之類的。

所以這個系統的基本功能:

  • 設定店名
  • 顯示今日特色
  • 喊出客人所點的東西

Wood Bakery Code,其中我們用一個Struct來定義WoodSpecial。

讓我們在main中執行看看

輸出結果:

目前來看就是把所有的功能都寫在了WoodBakery這個Class中。

但隨著Wood Bakery的系統越來越智能,他們提供的功能也開始變多了,這時候如果繼續把所有的功能寫在一起,似乎會讓這個Class越來越臃腫,能不能將部分的功能交給別人來做呢?


代理模式(Proxy Pattern)

代理模式的核心是一個代理對象,此對象可以用語代表其他資源。

代理模式的使用場景:

  • 定義一個面向網頁或者RESTful服務等遠程資源的接口。
  • 管理開銷比較大的操作的執行過程。
  • 為其他對象的屬性和方法加上訪問控制。

我們為Stone Bakery設計的系統:

首先我們為了將『準備Today’s Special」以及「喊單」的工作交給別人,我們定義了StoneBakeryDataSource以及StoneBakeryDelegate兩個Protocol。

  • 當有人要接手「準備Today’s Special」的工作時,他必須實現StoneBakeryDataSource中所提到的方法。
  • 當有人要接手「喊單」的工作時,他必須實現StoneBakeryDelegate中所提到的方法。

我們決定將「準備Today’s Special」的工作交給Chief

我們將「喊單」的工作交給Waiter

在初始化時,我們實例化StoneChef和StoneWaiter並且將他們分別賦值給dataSource、delegate。

實際上在Main調用方法時,是這樣的:

輸出結果:


在我們把工作都交給別人之後真的輕鬆很多啊~這裡將代理模式的例子放在github上面提供參考。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *