未来の私へ送るデザインパターン 4/24 [TemplateMethod]

このシリーズは、この内容を忘れた未来のcacaponが読んだときに、
自力でそれを使ったプログラムが自作できることを目的として作られました~

こちらの記事は、以下を主に参考に作成しておりま…
したが、理解しにくい部分が多々出てきたので現在模索中です~

www.techscore.com

今回はGoF本を参考にしました~

オブジェクト指向における再利用のためのデザインパターン
エリック ガンマ ラルフ ジョンソン リチャード ヘルム ジョン ブリシディース
ソフトバンククリエイティブ
売り上げランキング: 18,655

残りは、cacaponの記憶の片隅にある情報がソース元になります~

TemplateMethodってどんなやつ?

テンプレートとかテンプレってよく聞きますよね。
その意味は?って気かけるとすぐ説明できなくてあたふたしてしまいましたが…
調べてみたところ、日本語にすると「ひな形」がしっくりくるでしょうか。

cacaponのイメージでは一番しっくりくるのが↓ですかね~

f:id:cacapon:20200220123541p:plain

ハンコは、最初にその形にしてしまえば
後は、どこに押そうと思っていても同じ形の印を押すことができます~
また、朱肉とかインクを変えれば色の違うハンコを同じ形で押すこともできます~

日常生活だと結構当たり前な事かもしれませんが、
「どこで使っても同じ印(処理手順)になる」
「個別の要素(インク)を変えれば、結果も個別になる(赤色だったり黒色だったり)」
といった要素をコンピュータで使えるようにしたのが、 TemplateMethodなんだと私は思います~

オブジェクト指向って、そういう日常の便利な要素を
コンピュータに取り入れるっていうの結構あるんですよね~

調べてて面白いです~


f:id:cacapon:20200220125831p:plain


## pythonでの実装例

# template_mothod.py

from abc import ABCMeta, abstractmethod


class abstractclass(metaclass=ABCMeta):
    def TemplateMethod(self):
        # ここにアルゴリズムの共通のステップを記述します。
        self.PrimitiveOperation1()
        self.PrimitiveOperation2()
        self.CommonOperation()

    @abstractmethod
    def PrimitiveOperation1(self):
        # 処理の詳細はサブクラスに記述します
        pass

    @abstractmethod
    def PrimitiveOperation2(self):
        # 同上
        pass

    def CommonOperation(self):
        # 共通の処理があるのなら、abstractclass内で定義しても良いそうです
        print('finished output.\n')


class ConcreteClass1(abstractclass):
    def PrimitiveOperation1(self):
        print('Hello')

    def PrimitiveOperation2(self):
        print('World')


class ConcreteClass2(abstractclass):
    def PrimitiveOperation1(self):
        print('welcome')

    def PrimitiveOperation2(self):
        print('python!')


if __name__ == "__main__":
    test1 = ConcreteClass1()  # サブクラスのインスタンスを作成し
    test2 = ConcreteClass2()

    test1.TemplateMethod()  # 手順を記載したTemplateMethodを呼び出します
    test2.TemplateMethod()

'''
[output]

$ python template_method.py
Hello
World
finished output.

welcome
python!
finished output.
'''


疑問点

特にありませんでした。まだ分かっていないだけかもしれませんが…