from abc import ABC, abstractmethod class IBeverage(ABC): @abstractmethod def getDescriprion(self) -> str: pass @abstractmethod def getCost(self) -> int: pass class Coffe(IBeverage): def getDescriprion(self) -> str: return "Coffee" def getCost(self) -> int: return 100 class Tea(IBeverage): def getDescriprion(self) -> str: return "Tea" def getCost(self) -> int: return 100 class MilkShake(IBeverage): def getDescriprion(self) -> str: return "Milk Shake" def getCost(self) -> int: return 250 class ToppingDecorator(IBeverage): def __init__(self, beverage: IBeverage): self._beverage = beverage def getDescriprion(self) -> str: return f"{self._beverage.getDescriprion()}, {self.getToppingDescription()}" def getCost(self) -> int: return self._beverage.getCost() + self.getToppingCost() @abstractmethod def getToppingDescription(self) -> str: pass @abstractmethod def getToppingCost(self) -> int: pass class Cinnamon(ToppingDecorator): def getToppingDescription(self) -> str: return "Cinnamon" def getToppingCost(self) -> int: return 30 class Ice(ToppingDecorator): def getToppingDescription(self) -> str: return "Ice" def getToppingCost(self) -> int: return 15 coffee, tea, milkshake = Coffe(), Tea(), MilkShake() beverages = [Ice(Cinnamon(coffee)), Cinnamon(tea), Cinnamon(milkshake)] for beverage in beverages: print(f"{beverage.getDescriprion()} - Cost: {beverage.getCost()}")