Swift 設計模式 – 外觀模式 (Facade Pattern)

Stone City 的市長決定在過年前舉辦一場挖寶活動,帶動大家過年的氣氛,於是再次邀請了你和我來開發一套程式,讓市民可以通過程式來控制船隻進行挖寶。

民眾遙控船隻挖寶系統設計

TreasureMap

     

我們需要一個 TreasureMap 類,

  • 寶物有三種類型:金(Gold)、銀(Silver)、銅(Bronze),
  • 可以通過 findTreasure 獲得某種寶物的所在地

Ship

我們需要一個 Ship 類,

  • 通過 Struct ShipLocation 來紀錄自身的座標。
  • 提供一個移動船隻的方法 moveToLocation(),移動完成會通過 callback 反饋 location 給調用者。

Member

我們需要一個挖寶人行機器人,來幫忙挖寶物:

通過 enum Actions 來規定三種挖寶行為:digForGold, digForSilver, digForBronze

提供一個挖寶方法 performAction(),並且在成功挖到寶物時,通過 callback 反饋 prizeValue(寶物的價值)給調用者。

經過幾個小時的開發,我們兩個很快就把模型給做出來了,馬上來請Stone City市長試試看吧~!

  1. 市長先初始化了map, ship, member
  2. 接著通過 map 取得 gold 的藏寶地點,treasureLocation,
  3. 然而這個 treasureLocation 的內容,ship 是沒有辦法直接使用的,所以還需要進行一些翻譯,轉換成 shipTarget。
  4. 最後執行 ship.moveToLocation(),當移動到位置時,再請人型機器人開始挖寶,即調用 member.performAction(),挖到寶物時print出結果。

結果出來了,不過市長也滿身大汗了。

Stone City的市長擦了擦汗,他感覺這樣的操作有點複雜,他覺得目的其實就是挖寶,能不能讓市民只需要告訴程式想要挖什麼寶物就開始挖寶,最後只要告訴市民挖的結果就好了呢?


外觀模式(Facade Pattern)

就像上面那台機器一樣,如果我們今天想要買飲料,除了投入硬幣選擇想要的飲料外,我們還需要像夾娃娃機一樣去遙控抓取飲料,似乎有點太不方便了(雖然多了點樂趣哈)。所以對我們來說,一台自動販賣機,我們希望他可以簡單地讓我們直接選擇需要的飲料,並把飲料吐出來給我們就好了(當然還需要付錢XD)。而這樣的想法,其實就是外觀模式,這種設計模式是用來簡化一個或者多個類提供的API,以讓常見任務可以更簡便的執行。

我們創建一個 StoneFacade,將挖寶過程中會操作到的 map, ship, member 整合在一起,並對外開放一個 getTresure() 方法。

有了 StoneFacade,就可以讓 Stone 市民輕鬆去挖寶啦~!


Reference

發表迴響

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