Decoratorパターン

はじめに

今回はデザインパターンの一つ、Decoratorパターンについて紹介していきます。

Decoratorパターンとは

Decorator パターン(デコレータ・パターン)とは、GoFGang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 このパターンは、既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする。

Decorator パターン - Wikipediaより引用

GoFの書籍はこちら

Decoratorパターンは構造に関するデザインパターンです。

Decoratorとは装飾者、装飾する者という意味です。

Decoratorパターンでは既存のオブジェクトをラップした上で、装飾(新しい機能)を追加して拡張していくデザインパターンです。

なので、この"既存オブジェクト"の機能は全て実装した上で、追加機能(プラスアルファの処理)を実行します。

使用用途としては、同じクラスの他のインスタンスとほとんど同じ振る舞いをさせたいけど、

一部機能を拡張したい!という場合に使います。

クラス図

クラス図は以下のようになります。

f:id:dasuko:20200709235017p:plain

実装例

C#で実装してみたいと思います。

今回実装するサンプルのクラス図は以下です。

f:id:dasuko:20200710015245p:plain

スライムというキャラクターがいて、BurnedCharacterDecoratorは火傷をおっているキャラクターのためのDecoratorです。

// ICharacter interface
public interface ICharacter
{
    // Attack
    void Attack();
}

// Slime class
public class Slime : ICharacter
{
    public void Attack()
    {
        // Attack!!!!!
    }
}

// Character Decorator class
public class CharacterDecorator : ICharacter
{
    // Wrapped character object
    private readonly ICharacter character;

    public CharacterDecorator(ICharacter character)
    {
        this.character = character;
    }

    public virtual void Attack()
    {
        character.Attack();
    }
}

// Burned Character Decorator class for Burned Characters
public class BurnedCharacterDecorator : CharacterDecorator
{
    public BurnedCharacterDecorator(ICharacter character) : base(character)
    {

    }

    public override void Attack()
    {
        base.Attack();

        // Burn Effect!!!!
    }
}

まとめ

Decoratorパターンは既存オブジェクトに変更を加えることなく、それをラップすることにより静的または動的に拡張することができます。

基底クラスに変更を加えないので、仕様の追加や変更があった場合にも基底クラスは、変更することなくクリーンな状態を保つことができます。

より拡張性のある柔軟な設計が可能となるので、基底クラスに機能を追加するだけでなく、このようなラッパーを実装することにより

クラスを拡張していくことも試してみてはいかがでしょうか。

参考

12. Decorator パターン | TECHSCORE(テックスコア)

Decorator パターン - Wikipedia

Decorator pattern - Wikipedia