Swift設計模式 – 裝飾器模式(Decorator Pattern)

還記得Stone City之前那家有名的Stone Bakery嗎?我們當時利用觀察者模式給他們設計了一套通知系統。
在後來的經營過程中,他們深深的感受到科技帶來的好處,於是這次他們又來找我們了,希望我們能夠設計一套便捷的下單系統。

下單系統的設計

創建一個Purchase類,Purchase中可以選擇商品並且輸入價格:

接著我們為客戶建立一個CustomerAccount類別,這個類別中包含了:

  • 客戶的名稱
  • 購買的商品(用Purchase類表示)
  • 增加商品的方法addPurchase()
  • 顯示目前購物車中的內容showAccount()

這樣一個簡單的系統就完成了,通過實例化CustomerAccount,我們就可以向account中加入商品。

最後通過account.showAccount方法來顯示購物車中的商品內容。

結果顯示:

Stone Bakery的老闆很高興,不過他之前去Wood City和Wood Bakery老闆交流很多,
他發現Wood Bakery賣的不僅僅是麵包甜點,他們同時提供包裝、運送的服務,將麵包甜點變成一個非常適合用來送禮的商品。
所以,Stone Bakery的老闆又來找我們了,他希望能夠加入更多的服務項目來讓客戶掏錢,喔不是,是讓客戶開心啦(hahahhahah….)

下單系統的強化

我們創建一個Services類,用來提供商品以外的服務,分別是:

  • PurchaseWithDelivery()
  • PurchaseWithGiftWrap()
  • PurchaseWithCard()

我們試試看再購買Chocolate的時候加入運輸服務:

看來沒問題,當購買加入Chocolate的時候會加上運輸費用5元。

但寫到這裡,總覺得哪裡怪怪的………沒錯!萬一有個客戶同時需要的服務是混搭的呢?

  • chocolate + 運輸 + 卡片
  • chocolate + 運輸 + 包裝
  • chocolate + 運輸 + 卡片 + 包裝
  • chocolate + 運輸 + 包裝
  • …. …

…….看來可能性很多阿,一旦提供的服務開始多起來,我猜光是寫各種搭配就要寫很久了Orz…..

該怎麼辦呢?


裝飾者模式(Decorator Pattern)

裝飾器模式可以選擇性的修改對象的行為,可以使用的場景很多,尤其是在無法修改類的時候。
在擴展方面裝飾者模式比生成子類更靈活。

  • 何時應該避免使用:如果可以修改想要修改的對象的類,這時候往往直接修改更簡單。
  • 陷阱:最容易碰到的陷阱就是直接使用Swift的Extension來裝飾對象。
    裝飾器的一個主要特徵是「選擇性」的應用到單個對象上,而Extension則是修改所有某個類型的對象。

我們首先在Services.swift文件中,創建BasePurchaseDecorator用來繼承無法修改的Purchase類,並且讓那些服務都來繼承BasePurchaseDecorator.

我們來試試看,購買一個價格為30元的Cholate,並且購買包裝和運輸的服務,調用的過程就像上圖一樣。

馬上就可以看到我們要的效果咯:


看來新服務上線,大家都來體驗啦,可以到Github上看看次的裝飾者模式例子

 

發表迴響

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