0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで実装するStrategyパターン:アルゴリズムの切り替えを柔軟に設計する

Posted at

概要

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パターンはその柔軟な知性を、設計における選択肢として構造化する技法である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?