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()