背景
ミノ駆動本を読む中でストラテジーパターンを知りました。interfaceの使い方についてDIと単体テストでモックのイメージしか持ててなく、ソフトウェア設計のパターンとしての使い方があることを知り、理解を深めるために自身で調べたことだったりまとめます。
ストラテジーパターン
概要
ソフトウェア設計におけるデザインパターンの一つで、アルゴリズムをカプセル化し、アルゴリズムの選択や切り替えを容易にする。
メリット
以下の理由から可読性および保守性が高まる
- Swhich文を置き換えることができる
- クラスによる責任が明確になり修正が容易になる
自分の理解
ストラテジーパターンを調べると↓のクラス図がでてくる。これは、どういう文脈(Context)で使うかに対して戦略(Strategy)を用意するがどうやって実現(Concreate)するかは選択可能。シーンによってやりたい事は同じだけどやり方は変わる時に有用。
例)会計するシーンでお金を払うけど現金・クレジット・QR決済と選択できる
実装例(C#)
ストラテジーインターフェースの作成
public interface IStrategy
{
void Execute();
}
具体的なストラテジークラスの作成
public class ConcreteStrategyA : IStrategy
{
public void Execute()
{
Console.WriteLine("Strategy A executed.");
}
}
public class ConcreteStrategyB : IStrategy
{
public void Execute()
{
Console.WriteLine("Strategy B executed.");
}
}
- コンテキストクラスの作成
public class Context
{
private IStrategy _strategy;
public Context(IStrategy strategy)
{
_strategy = strategy;
}
public void SetStrategy(IStrategy strategy)
{
_strategy = strategy;
}
public void ExecuteStrategy()
{
_strategy.Execute();
}
}
- 使用例
class Program
{
static void Main(string[] args)
{
Context context = new Context(new ConcreteStrategyA());
context.ExecuteStrategy(); // Output: Strategy A executed.
context.SetStrategy(new ConcreteStrategyB());
context.ExecuteStrategy(); // Output: Strategy B executed.
}
}
デメリット
- 採用することでクラスが増え、コードが複雑になる
- 小規模なプロジェクトではかえって邪魔になる
- ストラテジーパターンが使われていることに気づかず、処理が分散した時に予期しないバグが発生する