diff --git a/src/cafeordersimulator/beverage.py b/src/cafeordersimulator/beverage.py new file mode 100644 index 0000000..08f1592 --- /dev/null +++ b/src/cafeordersimulator/beverage.py @@ -0,0 +1,93 @@ +""" +각종 음료 관련 코드 + +Description: + 추상클래스 Beverage를 상속받아, Espresso, HouseBlend 구현 + +Author: + Name: Gangmin Kim + Email: rlarkdals7@gmail.com +""" +from abc import ABCMeta, abstractmethod + + +class Beverage(metaclass=ABCMeta): + """ + Description: + 다양한 Beverage들을 구현하기 위한 Abstractive class + """ + + def __init__(self): + self.size = "tall" + + def get_description(self) -> str: + """ + Description: + 상속받는 클래스에 따라 Beverage의 이름 출력 구현 + """ + + def set_size(self, size) -> str: + """ + Description: + Beverage의 사이즈 지정 + + args : + size : Beverage의 사이즈 + """ + self.size = size + + def get_size(self) -> str: + """ + Description: + Beverage의 사이즈 출력 구현 + """ + return self.size + + @abstractmethod + def cost(self) -> float: + """ + Description: + 상속받는 클래스에 따라 Beverage의 가격 출력 구현 + """ + + +class Espresso(Beverage): + """ + Description: + Beverage 중 Espresso 클래스 + """ + + def get_description(self) -> str: + """Espresso 이름 출력 구현 + + Returns: name of beverage + """ + return "Espresso" + + def cost(self) -> float: + """Espresso 가격 출력 구현 + + Returns: cost of beverage + """ + return 1.99 + + +class HouseBlend(Beverage): + """ + Description: + Beverage 중 Espresso 클래스 + """ + + def get_description(self) -> str: + """Espresso 이름 출력 구현 + + Returns: name of beverage + """ + return "HouseBlend" + + def cost(self) -> float: + """Espresso 가격 출력 구현 + + Returns: cost of beverage + """ + return 0.89 diff --git a/src/cafeordersimulator/condiment.py b/src/cafeordersimulator/condiment.py new file mode 100644 index 0000000..6a383af --- /dev/null +++ b/src/cafeordersimulator/condiment.py @@ -0,0 +1,106 @@ +""" +각종 음료 관련 코드 + +Description: + 추상클래스 Beverage를 상속받아, Espresso, HouseBlend 구현 + +Author: + Name: Gangmin Kim + Email: rlarkdals7@gmail.com +""" +from typing import Any + +from beverage import Beverage + + +class CondimentDecorator(Beverage): + """ + Description: + 첨가물을 나타내는 추상클래스 + """ + + def __init__(self, bevarage: Beverage) -> None: + super().__init__() + self._beverage = bevarage + + @property + def beverage(self) -> Beverage: + """ + Description: + 상속받는 클래스에 따라 구현 + + Returns: + beverage + """ + return self._beverage + + def get_description(self) -> Any: + """ + Description: + 상속받는 클래스에 따라 Beverage의 이름 출력 구현 + + Returns: + beverage.get_description + """ + return self._beverage.get_description() + + def get_size(self) -> Any: + """ + Description: + 상속받는 클래스에 따라 Beverage의 사이즈 출력 구현 + + Returns: + beverage.get_size + """ + return self._beverage.get_size() + + def cost(self) -> Any: + """ + Description: + 상속받는 클래스에 따라 Beverage의 가격 출력 구현 + + Args: + None + + Returns: + beverage.cost + """ + return self._beverage.cost() + + +class Mocha(CondimentDecorator): + """ + Description: + Mocha를 나타내는 클래스 + """ + + # def __init__(self, bevarage: Beverage) -> None: + # super().__init__() + # self._beverage = bevarage + + def get_description(self) -> Any: + """ + Description: + 설명을 덧붙이는 함수 + + Returns: + beverage의 이름 + ", 모카" + """ + return self._beverage.get_description() + ", 모카" + + def cost(self) -> Any: + """ + Description: + cost 계산시 size에 따라서 cost를 계산해준다. + Returns: + beverage cost + size depends cost + """ + beverage_cost = self._beverage.cost() + + if self._beverage.get_size() == "tall": + beverage_cost += 0.10 + elif self._beverage.get_size() == "grande": + beverage_cost += 0.15 + elif self._beverage.get_size() == "venti": + beverage_cost += 0.20 + return beverage_cost diff --git a/src/cafeordersimulator/test.py b/src/cafeordersimulator/test.py new file mode 100644 index 0000000..a2cc413 --- /dev/null +++ b/src/cafeordersimulator/test.py @@ -0,0 +1,38 @@ +""" +cafe order test 코드 + +Description: + cafe order 테스트를 위한 코드 + +Author: + Name: Gangmin Kim + Email: rlarkdals7@gmail.com +""" + +from beverage import Espresso, HouseBlend +from condiment import Mocha + + +def main() -> None: + """summary + Description: + Test 진행함수 + """ + bevarage = Espresso() + print(bevarage.get_description() + " $" + str(bevarage.cost())) + assert bevarage.get_description() == "Espresso" + + beverage2 = HouseBlend() + beverage2 = Mocha(beverage2) + print(beverage2.get_description() + " $" + str(beverage2.cost())) + assert beverage2.get_description() == "HouseBlend, 모카" + + beverage3 = HouseBlend() + beverage3.set_size("venti") + beverage3 = Mocha(beverage3) + print(beverage3.cost()) + assert beverage3.cost() == 1.09 + + +if __name__ == "__main__": + main()