36 lines
916 B
Python
36 lines
916 B
Python
"""Скидки демо-проекта ci-demo (СТРПО, неделя 9, Gitea edition)."""
|
||
from abc import ABC, abstractmethod
|
||
|
||
|
||
class Discount(ABC):
|
||
@abstractmethod
|
||
def apply(self, total: float) -> float:
|
||
"""Вернуть сумму с учётом скидки."""
|
||
|
||
|
||
class NoDiscount(Discount):
|
||
def apply(self, total: float) -> float:
|
||
return total
|
||
|
||
|
||
class VIPDiscount(Discount):
|
||
def apply(self, total: float) -> float:
|
||
return total * 0.9
|
||
|
||
|
||
class EmployeeDiscount(Discount):
|
||
def apply(self, total: float) -> float:
|
||
return total * 0.7
|
||
|
||
|
||
DISCOUNTS: dict[str, type[Discount]] = {
|
||
"regular": NoDiscount,
|
||
"vip": VIPDiscount,
|
||
"employee": EmployeeDiscount,
|
||
}
|
||
|
||
|
||
def discount_for(customer_type: str) -> Discount:
|
||
"""Выбрать стратегию скидки по типу клиента."""
|
||
return DISCOUNTS.get(customer_type, NoDiscount)()
|