‍🦔 【Python】デザインパターン学習 - Template Methodパターン -
作成日: 2021/07/13
0

注意)このTicketはあくまで自分用のメモ。厳密な定義などは参考サイトを参照のこと

Template Methodパターンについて学ぶ

参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。

Template Methodパターンとは

pythonでの書き方

from abc import ABCMeta, abstractmethod

#抽象クラス
class Charactor(metaclass=ABCMeta):
    @abstractmethod
    def printJob(self):
        pass

    @abstractmethod
    def attack(self):
        pass

    @abstractmethod
    def defence(self):
        pass

    def strike(self):
        self.printJob()
        self.attack()
        self.attack()
        self.attack()
    
    def attack_and_defence(self):
        self.printJob()
        self.attack()
        self.defence()

class Wizard(Charactor):
    def printJob(self):
        print("魔法使い ----------")
    
    def attack(self):
        print("サンダーを唱えた")
    
    def defence(self):
        print("防壁を出現させた")

class Solider(Charactor):
    def printJob(self):
        print("戦士 ----------")
    
    def attack(self):
        print("相手に切りかかった")
    
    def defence(self):
        print("盾を構えた")

if __name__=='__main__':
    wizard = Wizard()
    wizard.strike()
    wizard.attack_and_defence()

    solider = Solider()
    solider.strike()
    solider.attack_and_defence()
    

実行結果

魔法使い ----------
サンダーを唱えた
サンダーを唱えた
サンダーを唱えた
魔法使い ----------
サンダーを唱えた
防壁を出現させた
戦士 ----------
相手に切りかかった
相手に切りかかった
相手に切りかかった
戦士 ----------
相手に切りかかった
盾を構えた

書いた感想

抽象クラスの実践的な使い方というイメージ

Template Methodパターン どういったときに使う?

似た処理の流れを一つにまとめるときに使える。
(Facadeパターンはクラスが異なる処理を一つにまとめるときに使えたが、このパターンは同一クラスの処理をまとめるときに使える という解釈)
Templateとして処理をまとめる。
Templateとしてまとめた処理がコロコロ変わる場合には向いてない。
デメリットとして継承を用いた方法のため親クラスと子クラスが密接な関係になることが挙げられる。
メリット・デメリットに関しては下記を参照

メリット

・スーパークラスにロジックが集中しているので、バグが生じてもTemplateMethodのみを修正すればいい
・サブクラスの設計が簡潔になる
デメリット

・サブクラスの数が増加する
・親と子の関係が密接なので、スーパークラスのソースを確認しないと実装が難しい
・スーパークラスの処理が大きくなると、サブクラスの自由度が減少する
(参考サイト3より引用)

書いたコード

github

参考サイト

  1. youtube:Template Methodパターン【コードで理解する】- プログラミング相談所
  2. wiki:Template Method パターン
  3. デザインパターン「Template Method」

フリーランスでpythonエンジニアとして働きたく勉強中。 前職は運用SEとセキュリティエンジニア。 開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。