佐々木屋

技術的なことから趣味まで色々書きます

Strategyパターン

デザインパターンの中でもよく見るものですが、オブジェクト指向が分からないとチンプンカンプンになります。

「戦略」という意味で、メソッドなどにちりばめられた静的なアルゴリズムを、ifやswitch(VB.NETはSelect Case)などの条件分岐で動的にアルゴリズムごと変更してしまう手法です。

このパターンによってアルゴリズムに変更が生じても、条件分岐で意図しない影響が出ないようになります。

まずインターフェースを定義します。

Public interface IStrategy {
    void Work();
}
Public Interface IStrategy
    Sub Walk()
End Interface

次にそれらを実装したクラスを定義します。

public class Class1 : IStrategy {
    public void Walk() {
        Console.WriteLine("テクテク歩く");
    }
}

public class Class2 : IStrategy {
    public void Walk() {
        Console.WriteLine("ノソノソ歩く");
    }
}

public class Class3 : IStrategy {
    public void Walk() {
        Console.WriteLine("サクサク歩く");
    }
}
Public Class Class1
    Implements IStrategy

    Public Sub Walk() Implements IStrategy.Work
        Console.WriteLine("テクテク歩く")
    End Sub
End Class

Public Class Class2
    Implements IStrategy

    Public Sub Walk() Implements IStrategy.Work
        Console.WriteLine("ノソノソ歩く")
    End Sub
End Class

Public Class Class3
    Implements IStrategy

    Public Sub Walk() Implements IStrategy.Work
        Console.WriteLine("サクサク歩く")
    End Sub
End Class

最後に、インターフェースを通じて必要な処理を返す(委譲させるための)クラスを定義します。

public class Context {
    public IStrategy Strategy { set; get; }

    public void Execute() {
        Strategy.Walk();
    }
}
Public Class Context
    Public Property Strategy As IStrategy

    Public Sub Execute()
        Strategy.Walk()
    End Sub
End Class

こうすることで、メインコードからアルゴリズムを切り離してカプセル化することにより、不用意な操作やアルゴリズムの変更に対応できるようになります。

var cls = new Context();

cls.Strategy = new Class1();
cls.Execute();

cls.Strategy = new Class2();
cls.Execute();

cls.Strategy = new Class3();
cls.Execute();
Dim cls As New Context()

cls.Strategy = New Class1()
cls.Execute()

cls.Strategy = New Class2()
cls.Execute()

cls.Strategy = New Class3()
cls.Execute()