Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

Pythonで学ぶデザインパターン[Template]

Icon in a callout block
Python 100Days Challenge Day26

Templateメソッドについて学んだのでまとめていく。

概要

簡単にいうと、大まかな手順は親が決めて、詳細の処理は子が実装する親子関係がある考え方のデザインパターン

  • スーパークラス(親)で処理の骨組みを定義する
  • 具体的な処理の部分はサブクラス(子)に任せる

では、実際にコードを書いてみる。

Template Methodで料理をつくる

スーパークラスで料理を作る手順を決めて、具体的な料理(スパゲッティやカレーなど)の作り方をサブクラスで実装してみる。

  • Cookingクラスをスーパークラスとする
    • cookメソッドで料理の手順を決める
      • 材料を準備する
      • 料理をする
      • 料理をお皿に盛り付ける
  • prepare_ingredientsメソッドとcook_dishメソッドをサブクラスで定義する
    • それぞれスパゲッティとカレーの具体的な作り方を実装
      • prepare_ingredientsで仕込みの準備をする、という表現になるらしい

# スーパークラス
class Cooking:
    def cook(self):
        self.prepare_ingredients()
        self.cook_dish()
        self.serve()
    
    def prepare_ingredients(self):
       raise NotImplemenedError("このメソッドはサブクラスで実装してください")
       
    def cook_dish(self):
        raise NotImplemenedError("このメソッドはサブクラスで実装してください")
        
    def serve(self):
        print("料理をお皿に盛り付ける")
        
# スパゲッティを作るサブクラス
class Spaghetti(Cooking):
    def prepare_ingredients(self):
        print("スパゲッティ、トマトソース、野菜を準備する")
        
    def cook_dish(self):
        print("スパゲッティを茹でて、トマトソースと混ぜる")

# カレーを作るサブクラス
class Curry(Cooking):
    def prepare_ingredients(self):
        print("カレー粉、お肉、野菜を準備する")
        
    def cook_dish(self):
        print("お肉と野菜を炒めて、カレー粉と水を加えて煮込む")
 
# 作ってみる
if __name__ == "__main__":
    # スパゲッティを作る
    spaghetti = Spaghetti()
    spaghetti.cook()
    
    print()
    
    # カレーを作る
    curry = Curry()
    curry.cook()
    
> 
スパゲッティ、トマトソース、野菜を準備する
スパゲッティを茹でて、トマトソースと混ぜる
料理をお皿に盛り付ける

カレー粉、お肉、野菜を準備する
お肉と野菜を炒めて、カレー粉と水を加えて煮込む
料理をお皿に盛り付ける

この書き方結構見やすい。

Powered by Tomo with passion.