概要
Strategy(ストラテジー)パターンは、
動的に異なるアルゴリズム(戦略)を切り替えられるように設計することで、柔軟で保守しやすいアーキテクチャを構築する手法である。
条件分岐によるアルゴリズムの選択を排除し、カプセル化された“戦略オブジェクト”によって動作を切り替えるのが特徴。
1. なぜStrategyが必要か?
❌ 複数のアルゴリズムをif文で選び分けていると、保守が困難になる
def sort(data, method="quick"):
if method == "quick":
...
elif method == "merge":
...
elif method == "bubble":
...
→ 分岐が増えるほど複雑化し、拡張・変更が面倒に
✅ アルゴリズムごとに独立したクラスを用意し、動的に切り替え可能にする
sorter = QuickSort()
sorter.sort(data)
→ 戦略を外部化することで、選択・再利用・切り替えが容易に
2. 基本構造
✅ Strategyインターフェース(共通のAPI定義)
class SortStrategy:
def sort(self, data):
raise NotImplementedError
✅ ConcreteStrategy(具体的な戦略)
class QuickSort(SortStrategy):
def sort(self, data):
print("クイックソートでソート中")
return sorted(data) # 実装は簡略化
class BubbleSort(SortStrategy):
def sort(self, data):
print("バブルソートでソート中")
return sorted(data) # デモ用
✅ Context(戦略の利用者)
class Sorter:
def __init__(self, strategy: SortStrategy):
self.strategy = strategy
def set_strategy(self, strategy: SortStrategy):
self.strategy = strategy
def sort(self, data):
return self.strategy.sort(data)
✅ 使用例
data = [3, 1, 4, 1, 5, 9]
sorter = Sorter(QuickSort())
sorted_data = sorter.sort(data)
sorter.set_strategy(BubbleSort())
sorted_data = sorter.sort(data)
出力:
クイックソートでソート中
バブルソートでソート中
3. Python的応用:関数ベースの軽量Strategy実装
def quick_sort(data):
print("クイックソート")
return sorted(data)
def bubble_sort(data):
print("バブルソート")
return sorted(data)
strategies = {
"quick": quick_sort,
"bubble": bubble_sort
}
data = [5, 2, 8, 3]
strategies["quick"](data)
strategies["bubble"](data)
→ シンプルな戦略なら関数辞書で管理するのもPythonic
4. 実務ユースケース
✅ ソート、検索、圧縮アルゴリズムの切り替え
→ 使用環境・データ量・制約に応じて最適な戦略を選択
✅ 支払い方法(カード・銀行・QR)の処理統一
→ 戦略ごとの支払処理を切り替え可能
✅ コンテンツ推薦エンジン(レコメンドアルゴリズム)
→ ユーザータイプ・季節などでアルゴリズムを戦略として選択
✅ パス探索やAIの行動戦略
→ 状況に応じて最短距離・リスク回避・リソース優先などを切り替え
5. よくある誤用と対策
❌ 戦略が単に条件分岐をラップしているだけ
→ ✅ 戦略内部の実装も分離し、クラスごとに独立した責任を持たせる
❌ 戦略切り替えが頻繁すぎてContextが肥大化
→ ✅ 切り替えロジックは外部に出し、Contextは戦略利用のみに特化
❌ 戦略間のインターフェースがバラバラ
→ ✅ 抽象クラスで統一インターフェースを強制することで整合性を保つ
結語
Strategyパターンとは、“やり方(手段)を設計によって切り替える柔軟性”を持った構造である。
- 複数のアルゴリズムや方針をカプセル化し、動的に選択・差し替えが可能
- 実装の共通化と分離を両立し、保守性・拡張性を高める設計
- Pythonではクラス・関数・辞書の戦略が選べるため、状況に応じた最適な表現ができる
Pythonicとは、“戦略を差し替え可能なものとして扱うこと”。
Strategyパターンはその柔軟な知性を、設計における選択肢として構造化する技法である。