C#入門(第13回)

前回振り返り

デザインパターンとは

デザインパターンとは、先人達が発見し編み出した設計ノウハウが、再利用しやすいように特定の規約に従ってカタログ化されているものです。パターンに沿った実装を試すことで、自ずとオブジェクト指向への理解も深まってくるでしょう。

C#/Javaをマスターする為の近道

通称 Gang of Four、略称 GoF の4人組(Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)、彼らによって書かれた書籍、Design Patterns: Elements of Reusable Object-Oriented Software(邦題:オブジェクト指向における再利用のためのデザインパターン)において、23個のパターンが提唱されました。

代表的なパターンを幾つか実装してみましょう。

Strategyパターン

データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切り替えを容易にするパターンです。

このパターンでは、あるオブジェクトが、その動作の一部または全部を、特定のインターフェースに従った別のオブジェクトの観点から定義することができます。 このインターフェースの特定のインスタンスは、それがインスタンス化されたり呼び出されたりしたときにクライアントに提供され、使用される具体的な動作を提供します。 Strategyデザインパターンは、単一責任原則明示的依存関係原則依存関係逆転原則を実現するために広く使用され、依存性注入(Dependency Injection)と制御逆転(Inversion of Control)コンテナの使用の鍵となるものです。

Strategyパターンのクラス図

前回演習問題の解答 例

問題1

問題文

Strategy パターン をインターフェースを使って作成してみましょう。


解答例

Syain syain;

// 異なるアルゴリズムに従う3つのコンテキスト。
syain = new Syain(new Hira());
syain.standup();

syain = new Syain(new Kacho());
syain.standup();

syain = new Syain(new Bucho());
syain.standup();
interface ISyain
{
    void standup();
}
class Syain
{
    ISyain syain;

    // Constructor
    public Syain(ISyain syain)
    {
        this.syain = syain;
    }

    public void standup()
    {
        this.syain.standup();
    }
}
public class Hira : ISyain
{
    public void standup()
    {
        Console.WriteLine("平社員がしゃきっと立ちました。");
    }
}
public class Kacho : ISyain
{
    public void standup()
    {
        Console.WriteLine("課長がゆっくりと立ちました");
    }
}
public class Bucho : ISyain
{
    public void standup()
    {
        Console.WriteLine("部長が偉そうに立ちました。");
    }
}

問題2

問題文

Strategy パターン を継承関係を必要としないデリゲートを使って作成してみましょう。


解答例

using System;
Syain syain;

// 異なるアルゴリズムに従う3つのコンテキスト。
syain = new Syain(new Hira().standup);
syain.standup();

syain = new Syain(new Kacho().standup);
syain.standup();

syain = new Syain(new Bucho().standup);
syain.standup();
using ConsoleApp3;
using System;

class Syain
{
    SyainAction action;

    // Constructor
    public Syain(SyainAction action)
    {
        this.action = action;
    }

    public void standup()
    {
        this.action();
    }
}

namespace ConsoleApp3
{
    public delegate void SyainAction();
}
public class Hira
{
    public void standup()
    {
        Console.WriteLine("平社員がしゃきっと立ちました。");
    }
}
public class Kacho
{
    public void standup()
    {
        Console.WriteLine("課長がゆっくりと立ちました");
    }
}
public class Bucho
{
    public void standup()
    {
        Console.WriteLine("部長が偉そうに立ちました。");
    }
}

今回の演習問題

問題1

問題文

Decoratorパターン を作成してみましょう。

wikipedia のJava実装例をC#で記述してみましょう。

問題2

問題文

問1のクラスを身近なものにアレンジしてみましょう。

コメント