【Python デザインパターン】TemplateMethodパターン

Pythonで学ぶデザインパターン

TemplateMethodパターン

テンプレートの機能を持つパターンです。
親クラス(superクラス)にテンプレートとなる抽象メソッド(処理なし)と、
その各メソッドの呼び出しが定義されています。
抽象メソッドの処理内容を具体的に実装するのは子クラスです。
親クラスからどのような子クラスを作成したとしても、
基本的な流れは親クラスで決定しているためすべて共通になります。
このように親クラスが流れの枠組みを決め、
子クラスが処理の具体的内容をプロットしていくデザインパターンを
Template Methodパターンと呼びます。

サンプルプログラム

計算機(Calculator)のサンプルプログラムを考えます。

計算機を親クラスとし、足し算と掛け算のプログラムを作成していきます。

 

クラス図

templateMethod

計算機(親クラス)

class AbstractCalculator:

    def inputParam(self):
        pass
    def calc(self):
        pass
    def printResult(self):
        pass
    def execute(self):
        self.inputParam()
        self.calc()
        self.printResult()

 

計算機では実行(execute)メソッドだけを実装します。

このexecuteがテンプレートメソッドと呼ばれるメソッドです。

パラメータの入力、計算、結果の出力メソッドはすべて子クラスに実装を任せます

 

足し算(子クラス)

class AddCaluculator(AbstractCalculator):
    def inputParam(self):
        self.x = 10
        self.y = 15
    def calc(self):
        self.result = self.x + self.y
    def printResult(self):
        print(self.result)

パラメータの入力、計算(足し算)、結果の出力メソッドを実装します。

親クラスのexecuteメソッドを呼び出すだけで足し算し、結果が出力されます。

 

 

掛け算(子クラス)

class MultiCaluculator(AbstractCalculator):
    def inputParam(self):
        self.x = 10
        self.y = 15.5
    def calc(self):
        self.result = self.x * self.y
    def printResult(self):
        print(self.result)

パラメータの入力、計算(掛け算)、結果の出力メソッドを実装します。

親クラスのexecuteメソッドを呼び出すだけで掛け算し、結果が出力されます。

 

サンプルコード全般

class AbstractCalculator:

    def inputParam(self):
        pass
    def calc(self):
        pass
    def printResult(self):
        pass
    def execute(self):
        self.inputParam()
        self.calc()
        self.printResult()

class AddCaluculator(AbstractCalculator):
    def inputParam(self):
        self.x = 10
        self.y = 15
    def calc(self):
        self.result = self.x + self.y
    def printResult(self):
        print(self.result)

class MultiCaluculator(AbstractCalculator):
    def inputParam(self):
        self.x = 10
        self.y = 15.5
    def calc(self):
        self.result = self.x * self.y
    def printResult(self):
        print(self.result)

if __name__ == '__main__':

    addCaluculator = AddCaluculator()
    multiCaluculator = MultiCaluculator()

    addCaluculator.execute()
    multiCaluculator.execute()

 

TemplateMethodパターンでは

アルゴリズムは親クラスのテンプレートメソッドに実装されているため、

子クラスごとにアルゴリズムを実装する必要がありません。

処理を共通化することによって、

異なる子クラスであったのしても不具合の修正を最小限に抑えることが可能になります。

あわせて読みたい