晴耕雨読

working in the fields on fine days and reading books on rainy days

[C#] デコレータパターンを実装する

C# でデザインパターンの1つであるデコレータパターン (Decorator Pattern) を実装する方法について説明します。

デコレータパターンとは、構造に関するデザインパターンの一つで、ある振る舞いをラッパーで包み込むことで、元々の振る舞いに手を入れることなく、新しい振る舞いを付け加えることができる設計方法です。

以下は、挨拶を印字するための関数 MyFunction の呼び出し時に、開始と終了のログをstdoutに出力する処理を付け加えるための高階関数 MyDecorator を定義して使用する例です。

public static void Main()
{
    string res = MyDecorator("MyFunction()", () => MyFunction("YOUR NAME"));
    Console.WriteLine(res);
}

static string MyFunction(string message)
{
    return $"Hello, {message}!";
}

public static T MyDecorator<T>(string methodName, Func<T> func)
{
    Console.WriteLine($"[*] Start {methodName}");
    try
    {
        return func();
    }
    finally
    {
        Console.WriteLine($"[*] Finished {methodName}");
    }
}

上記のプログラムを実行すると、以下の結果が出力されます。

[*] Start MyFunction()
[*] Finished MyFunction()
Hello, YOUR NAME!

以上です。