【デザインパターン】Strategy


はじめに

おそばせながら、Pythonで開発するにあたって、デザインパターンってどうやって導入するか疑問になったので試しにstrategyを使ったサンプルを作成してみた。

サンプル

あるべき姿としては、1クラス1ファイルの形でまとめるべきと考えていますが、
ここでは、省略して1つのファイルで記述します。

概略だけメモ程度に残しておくと、、、
処理を管理者ユーザーと一般ユーザーで分けたいなぁと考えて調べてみました。

strategySample.py
#coding: utf-8
from abc import ABCMeta, abstractmethod

def main():
    manager = Person(ManagerStrategy())
    manager.execute()

    normal = Person(NormalStrategy())
    normal.execute()

class Person:

    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self):
        return self.strategy.execute()


class Strategy(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass

class ManagerStrategy(Strategy):
    def __init__(self):
        pass
    def execute(self):
        print("ManageStrategy")

class NormalStrategy(Strategy):
    def __init__(self):
        pass
    def execute(self):
        print("NormalStrategy")

if __name__=="__main__":
    main()

実行結果は以下のようになりました。

ManageStrategy
NormalStrategy

管理者と一般でどちらもexecute()ロジックを実行しているが、
管理者(manager)ではManageStrategyが出力され、
一般(normal)ではNormalStrategyが出力されている。
想定通りの挙動が確認できたのでとりあえずはよかった。