2009年9月5日土曜日

ストラテジーパターン

I/O が同じで、条件によって異なる処理を行いたい場合や、
将来的に変更または追加される可能性がある場合、
switch 文などの条件分岐に処理を埋め込んでいると、
変更が発生した際に他の条件へ意図しない影響が生じることがあります。

ストラテジーパターンは、インターフェースを介することで
アルゴリズムを動的に切り替えます。

まずは、ストラテジーパターンを使わない実装。

static void Main()
{
    string condition = "A";

    switch (condition)
    {
        case "A":
            Console.WriteLine("Executed condition A");
            break;
        case "B":
            Console.WriteLine("Executed condition B");
            break;
    }
}


続いて、ストラテジーパターンを適用した実装。

interface IStrategy {
    void Execute();
}

class StrategyA : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Called StrategyA.Execute()");
    }
}

class StrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Called StrategyB.Execute()");
    }
}

static void Main()
{
    GetStrategy("A").Execute();
    GetStrategy("B").Execute();
}

IStrategy GetStrategy(string condition)
{
    IStrategy result = null;

    switch (condition)
    {
        case "A":
            result = new StrategyA();
            break;
        case "B":
            result = new StrategyB();
            break;
        defalt:
            throw new ApplicationException();
    }

    return result;
}

0 件のコメント:

コメントを投稿