[Design Pattern] 裝飾者模式 (Decorator Pattern)
有玩過洛克人的人應該就會知道,洛克人打敗敵人之後,就可以取得敵人的能力,並在適當的時候裝備該能力。
裝飾者模式,就是把這些外在的功能附加在類別上面,而不會改變原本類別的內容。
目的
可以將額外的功能附加在物件之上,不需使用繼承便可以使用這些額外的功能。
模式
結構模式 (Structural Pattern)。
時機
如果想要新增功能並且不修改到原本的類別時。
範例
- 假設有一個名為 Hero 的介面,裡面包含了兩個方法
damage():Int
以及weapon():String
2. 建立一個 Hero 的具象類別: RockMan ,並實作這兩個功能
3. 定義裝飾者 (HeroWeaponDecorator) 類。
定義裝飾者類別命名為 HeroWeaponDecorator
,實作 Hero
介面,其中建構子的參數為 Hero。
4. 設計武器 (具象裝飾者類),將所有的裝飾者類都繼承 HeroWeaponDecorator
:
- AirManWeaponDecorator
- FireManWeaponDecorator
5. 將 RockMan 套用不同的武器 (裝飾)
可以發現,我們是將具象類別傳進裝飾類中,所以原本的具象類別 (RockMan) 並不會受到影響。
結構圖如下:
結論
利用裝飾模式 (Decorator Pattern) 可以輕鬆的將功能套用在原本的物件上,並且不會對原本的物件造成影響。
因為所有裝飾者的型別都是原介面,所以可以一層一層的疊上去。但是要注意,每一裝飾類不應該與其他類有順序關聯,否則在使用的時候可能會遇到問題。
如果一個介面上有很多方法需要實作,那麼當裝飾者繼承該介面時,同樣要實作這麼多的方法。
在 Kotlin 中,我們可以使用 by
關鍵字,將不需覆寫的方法用委託的方式來實作。
在上面的 HeroWeapon
類中,就使用了 by
關鍵字。
下面是不使用 by
關鍵字的 HeroWeapon
類別
使用 by
關鍵字是不是少寫了很多 code 呢?
gitHub: https://github.com/andyludeveloper/decorator_pattern_in_kotlin
如果你覺得本篇文章不錯,請拍手
👏鼓勵我~謝謝