certain-design-patterns/decorator.py

40 lines
1.4 KiB
Python
Raw Permalink Normal View History

2025-02-07 12:10:20 +03:00
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()}")