Strategy (ストラテジー)
戦略、兵法、作戦、etc...
Strategyパターンとは、オブジェクトの振舞いを"戦略"とみなして、戦略の切替、追加を簡単に行うことができるパターンです。
戦略の部分をクラスとして定義しておき、呼び出し元では利用する戦略クラスを変更することにより、戦略の切替を行います。
以下に例を示します。
- 走る"振る舞い"をあらわすInterfaceを定義する。
public interface IRunBehavior
{
void Run();
}
- IRunBehavior Interfaceを実装したクラスを作成し、実際に走る"振る舞い"を定義します。
public class RunFastBehavior : IRunBehavior
{
public void Run()
{
Console.WriteLine("速く走る!");
}
}
public class RunBehavior : IRunBehavior
{
public void Run()
{
Console.WriteLine("ふつうに走る");
}
}
public class RunSlowBehavior : IRunBehavior
{
public void Run()
{
Console.WriteLine("ゆっくり走る~");
}
}
- 走る動作を行うクラスを作成します。その際、走る動作はIRunBehavior型のフィールドのRunメソッドを呼び出す(IRunBehaviorに委譲する)ようにします。
また、走る"振る舞い"を交換できるように、setアクセサのみを持つプロパティを定義します。
public class Human
{
private IRunBehavior runBehavior;
public Human()
{
runBehavior = new RunBehavior();
}
public void ParformRun()
{
runBehavior.Run();
}
public IRunBehavior RunBehavior
{
set { this.runBehavior = value; }
}
}
以上のコードを実行してみます。
実行用コード
public class StrategyTest
{
static void Main(string[] args)
{
Console.WriteLine("よーい、スタート!");
Human human = new Human();
human.ParformRun();
human.RunBehavior = new RunFastBehavior();
human.ParformRun();
human.RunBehavior = new RunSlowBehavior();
human.ParformRun();
Console.WriteLine("ゴール!");
}
}
実行結果
よーい、スタート!
ふつうに走る
速く走る!
ゆっくり走る~
ゴール!
上記のように、走る"振る舞い"を交換しながらプログラムが実行されるのが確認できます。
次回は実際に実務でどのように使用すればよいかこれから考えて(^^;書こうと思います。
#間違っているところがあったらツッコミをお願いしますm(_ _)m