No more Death March

あるSEのチラシの裏 C# WPF

デコレーターパターン

Gofデザインパターンの一つ、デコレーターパターンについて復習します。
デコレーターパターンは比較的簡単で、デザインパターンの中で一番最初に覚えたパターンでした。
再利用しやすいコードを書く上で今でも欠かせないパターンだと思います。

デコレーターパターンとは

・デコレーターを日本語に訳すと「装飾者」
・ある型に対する拡張機能を同じ型で実装する

デコレーターパターンの構成

拡張する型の宣言

・デコレーターパターンで拡張機能を実装する型の宣言
・抽象クラスでも書けるがインターフェースの使用を推奨

    public interface ISample
    {
        void doSomething();
    }

装飾するクラス(デコレーター)

・デコレーターパターンで実装されたクラス
・コンストラクタで拡張する型を受け取る
・自身も拡張する型を実装する

    public sealed class SampleDecorator : ISample
    {
        public SampleDecorator(ISample decorated)
        {
            // 省略
        }
        public void doSomething()
        {
            // 省略
        }
    }

装飾されるクラス

・デコレーターのコンストラクタに渡されるクラス
・拡張対象の型を実装している
・デコレーター自身がデコレーターに渡されることもある

    public sealed class Sample : ISample
    {
        public void doSomething()
        {
            // 省略
        }
    }

使用例

    class Program
    {
        static void Main(string[] args)
        {
            new Sample().doSomething();
            new SampleDecorator(new Sample()).doSomething();
            new SampleDecorator(new SampleDecorator(new Sample())).doSomething();
        }
    }

デコレーターパターンのメリット

・既存のコードを変更せずに機能を追加することが出来る
・オープン・クローズドの原則の実現方法の一つ(拡張に対して開いていて、修正に対して閉じている)
・デコレーターを組み合わせ方を変えるだけで安全に機能のバリエーションを増やすことが出来る