Template Methodパターン

概要

スーパークラスで処理の枠組みを決め、サブクラスで具体的な内容を定める」パターンです。

例題

テストコードを実行するプログラムを書きます。
テストコードの仕様は以下のようにします。

  • setup関数 => main関数 => teardown関数 の順で実行
  • main関数が通った場合、”.”とクラス名を出力する
  • main関数でエラーが出たら”E”とクラス名を出力する
  • 上記出力は標準エラー出力へ出力する

サンプルコード

import sys


def main():
    Test1().test()
    Test2().test()


class TestFrame:
    def __init__(self):
        self.counter = 0

    def test(self):
        self.setup()
        try:
            self.main()
        except AssertionError:
            self.counter += 1
            sys.stderr.write("E => {}\n".format(self.__class__.__name__))
        if self.counter == 0:
            sys.stderr.write(". => {}\n".format(self.__class__.__name__))
        self.teardown()

    def setup(self):
        pass

    def main(self):
        pass

    def teardown(self):
        pass


class Test1(TestFrame):
    def setup(self):
        print("Test1 class setup method")

    def main(self):
        print("Test1 class main method")
        assert 1 == 1

    def teardown(self):
        print("Test1 class teardown method")


class Test2(TestFrame):
    def setup(self):
        print("Test2 class setup method")

    def main(self):
        print("Test2 class main method")
        assert 1 == 3

    def teardown(self):
        print("Test2 class teardown method")


if __name__ == "__main__":
    main()

# 出力

Test1 class setup method Test1 class main method Test1 class teardown method Test2 class setup method Test2 class main method Test2 class teardown method . => Test1 E => Test2

下2行は標準エラー出力に出ています。

特徴

Template Methodは割と使用場面がイメージしやすいです。

「処理の枠組み(=流れ)」が決まっているものは、処理の流れをスーパークラスに書き、
具体的な処理はサブクラスに書くだけで処理の枠組みを書く手間をへらすことができます。

Pythonらしく書くためのコツ

特になし

クラス図

# 一般的なクラス図

一般的なクラス図(Template Methodパターン)

# サンプルコードにおけるクラス図

サンプルコードにおけるクラス図(Template Methodパターン)

参考URL

特になし