[Design Pattern] 裝飾者模式 (Decorator Pattern)

用 Kotlin 示範

Andy Lu
Feb 5, 2021
攝影師:Mark Neal,連結:Pexels

有玩過洛克人的人應該就會知道,洛克人打敗敵人之後,就可以取得敵人的能力,並在適當的時候裝備該能力。

裝飾者模式,就是把這些外在的功能附加在類別上面,而不會改變原本類別的內容。

目的

可以將額外的功能附加在物件之上,不需使用繼承便可以使用這些額外的功能。

模式

結構模式 (Structural Pattern)。

時機

如果想要新增功能並且不修改到原本的類別時。

範例

  1. 假設有一個名為 Hero 的介面,裡面包含了兩個方法damage():Int 以及 weapon():String
Hero interface

2. 建立一個 Hero 的具象類別: RockMan ,並實作這兩個功能

concrete component: RockMan

3. 定義裝飾者 (HeroWeaponDecorator) 類。

定義裝飾者類別命名為 HeroWeaponDecorator,實作 Hero 介面,其中建構子的參數為 Hero。

Decorator

4. 設計武器 (具象裝飾者類),將所有的裝飾者類都繼承 HeroWeaponDecorator

  • AirManWeaponDecorator
AirMAnWeaponDecorator
  • FireManWeaponDecorator
FireManWeaponDecorator

5. 將 RockMan 套用不同的武器 (裝飾)

可以發現,我們是將具象類別傳進裝飾類中,所以原本的具象類別 (RockMan) 並不會受到影響。

結構圖如下:

結論

利用裝飾模式 (Decorator Pattern) 可以輕鬆的將功能套用在原本的物件上,並且不會對原本的物件造成影響。

因為所有裝飾者的型別都是原介面,所以可以一層一層的疊上去。但是要注意,每一裝飾類不應該與其他類有順序關聯,否則在使用的時候可能會遇到問題。

如果一個介面上有很多方法需要實作,那麼當裝飾者繼承該介面時,同樣要實作這麼多的方法。

在 Kotlin 中,我們可以使用 by 關鍵字,將不需覆寫的方法用委託的方式來實作。

在上面的 HeroWeapon 類中,就使用了 by 關鍵字。

Decorator

下面是不使用 by 關鍵字的 HeroWeapon 類別

使用 by 關鍵字是不是少寫了很多 code 呢?

gitHub: https://github.com/andyludeveloper/decorator_pattern_in_kotlin

如果你覺得本篇文章不錯,請拍手👏鼓勵我~謝謝

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet