From 54b2827b48b840b1ed00ba9a877c37b038d2c8b3 Mon Sep 17 00:00:00 2001 From: JunHyeok Date: Sat, 30 Jul 2022 01:23:11 +0900 Subject: [PATCH 1/4] feat) add caffeine beverage class --- .gitignore | 1 + src/template_pattern/caffeinebeverage.py | 79 ++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/template_pattern/caffeinebeverage.py diff --git a/.gitignore b/.gitignore index f9192af..71701a1 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,4 @@ dmypy.json .pyre/ # Project specific +.idea/ diff --git a/src/template_pattern/caffeinebeverage.py b/src/template_pattern/caffeinebeverage.py new file mode 100644 index 0000000..3cfdec7 --- /dev/null +++ b/src/template_pattern/caffeinebeverage.py @@ -0,0 +1,79 @@ +""" + 카페인 음료 클래스 + Description: + 카페인 음료 생성 템플릿을 가지고 있는 클래스 + Author: + Name: Junhyeok Yang + Email: surfing2003@naver.com +""" +from abc import ABC, abstractmethod +from typing import final + + +class CaffeineBeverage(ABC): + """ + Description: + 카페인 생성의 기본이 되는 추상 클래스 + """ + + @final + def prepare_recipe(self) -> None: + """ + 템플릿 역할을 하는 함수로 해당 클래스에 정의된 함수 외에 + 서브 클래스에서 선언될 함수의 순서를 가지고 있는 함수 + + Args: + None + Returns: + None + """ + self.boil_water() + self.brew() + self.pour_in_cup() + self.add_condiments() + + @classmethod + def boil_water(cls) -> None: + """ + 카페인 음료에 필요한 물을 끓이는 함수 + + Args: + None + Returns: + None + """ + print("물을 끓인다.") + + @classmethod + def pour_in_cup(cls) -> None: + """ + 카페인 음료를 컵에 따르는 함수 + + Args: + None + Returns: + None + """ + print("음료를 컵에 따른다.") + + @abstractmethod + def brew(self) -> None: + """ + 서브 클래스에 따라 바뀌는 함수 + + Args: + None + Returns: + None + """ + + @abstractmethod + def add_condiments(self) -> None: + """ + 서브 클래스에 따라 바뀌는 함수 + + Args: + None + Returns: + None + """ From f563efffffcf6d7c31f07f4055bfa816e351288d Mon Sep 17 00:00:00 2001 From: JunHyeok Date: Sat, 30 Jul 2022 01:30:01 +0900 Subject: [PATCH 2/4] feat) add sub class --- src/template_pattern/caffeinebeverage.py | 60 +++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/template_pattern/caffeinebeverage.py b/src/template_pattern/caffeinebeverage.py index 3cfdec7..89b366f 100644 --- a/src/template_pattern/caffeinebeverage.py +++ b/src/template_pattern/caffeinebeverage.py @@ -13,7 +13,7 @@ class CaffeineBeverage(ABC): """ Description: - 카페인 생성의 기본이 되는 추상 클래스 + 카페인 음료 생성의 기본이 되는 추상 클래스 """ @final @@ -77,3 +77,61 @@ def add_condiments(self) -> None: Returns: None """ + + +class Tea(CaffeineBeverage): + """ + Description: + 추상 클래스를 바탕으로 생성한 서브 클래스 + """ + + def brew(self) -> None: + """ + 홍차(서브클래스)에 맞는 함수 생성 + + Args: + None + Returns: + None + """ + print("찻잎을 우려낸다.") + + def add_condiments(self) -> None: + """ + 홍차(서브클래스)에 맞는 함수 생성 + + Args: + None + Returns: + None + """ + print("레몬을 추가한다.") + + +class Coffee(CaffeineBeverage): + """ + Description: + 추상 클래스를 바탕으로 생성한 서브 클래스 + """ + + def brew(self) -> None: + """ + 커피(서브 클래스)에 맞는 함수 생성 + + Args: + None + Returns: + None + """ + print("커피를 우려낸다.") + + def add_condiments(self) -> None: + """ + 커피(서브 클래스)에 맞는 함수 생성 + + Args: + None + Returns: + None + """ + print("설탕과 우유를 추가한다.") From f1b8c47cff4e260a19bed96c216ffa15b9ff6d4b Mon Sep 17 00:00:00 2001 From: JunHyeok Date: Sat, 30 Jul 2022 02:02:32 +0900 Subject: [PATCH 3/4] feat) add hook --- src/template_pattern/caffeinebeverage.py | 49 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/template_pattern/caffeinebeverage.py b/src/template_pattern/caffeinebeverage.py index 89b366f..f1887a7 100644 --- a/src/template_pattern/caffeinebeverage.py +++ b/src/template_pattern/caffeinebeverage.py @@ -30,7 +30,8 @@ def prepare_recipe(self) -> None: self.boil_water() self.brew() self.pour_in_cup() - self.add_condiments() + if self.customer_wants_condiments(): + self.add_condiments() @classmethod def boil_water(cls) -> None: @@ -56,6 +57,18 @@ def pour_in_cup(cls) -> None: """ print("음료를 컵에 따른다.") + @classmethod + def customer_wants_condiments(cls) -> bool: + """ + hook 역할 함수 + + Args: + None + Returns: + (bool): True or False + """ + return True + @abstractmethod def brew(self) -> None: """ @@ -107,6 +120,23 @@ def add_condiments(self) -> None: """ print("레몬을 추가한다.") + @classmethod + def customer_wants_condiments(cls) -> bool: + """ + 사용자의 입력을 바탕으로 참 또는 거짓을 반환하는 함수 + + Args: + None + Returns: + (bool): True or False + """ + answer = input("차에 레몬을 넣을까요? (y/n)") + + if answer == "y": + return True + + return False + class Coffee(CaffeineBeverage): """ @@ -135,3 +165,20 @@ def add_condiments(self) -> None: None """ print("설탕과 우유를 추가한다.") + + @classmethod + def customer_wants_condiments(cls) -> bool: + """ + 사용자의 입력을 바탕으로 참 또는 거짓을 반환하는 함수 + + Args: + None + Returns: + (bool): True or False + """ + answer = input("커피에 우유와 설탕을 넣을까요? (y/n)") + + if answer == "y": + return True + + return False From 9b4e5a9554ceeb97d6a6f0f94a3448d5a5065d32 Mon Sep 17 00:00:00 2001 From: JunHyeok Date: Sat, 30 Jul 2022 02:09:42 +0900 Subject: [PATCH 4/4] feat) add template pattern test --- src/template_pattern/template_test.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/template_pattern/template_test.py diff --git a/src/template_pattern/template_test.py b/src/template_pattern/template_test.py new file mode 100644 index 0000000..c8c4c55 --- /dev/null +++ b/src/template_pattern/template_test.py @@ -0,0 +1,20 @@ +""" + 템플릿 패턴 테스트 + + Description: + 템플릿 패턴 테스트를 위한 코드 + Author: + Name: Junhyeok Yang + Email: surfing2003@naver.com +""" +from caffeinebeverage import Coffee, Tea + +if __name__ == "__main__": + tea = Tea() + coffee = Coffee() + + print("홍차 준비중...") + tea.prepare_recipe() + + print("커피 준비중...") + coffee.prepare_recipe()