Skip to main content

Як реалізувати OCP через композицію?

OCP через композицію реалізується так, що клас не перевизначають через успадкування, а передають усередину нього об'єкт, який визначає поведінку. Нова поведінка додається створенням нових стратегій/компонентів, а не зміною наявного коду.

Детальніше:

1. Клас отримує залежність через інтерфейс або абстракцію

Замість того щоб перевизначати методи в нащадках, клас приймає об'єкт, який реалізує визначений контракт. Цей об'єкт визначає змінювану поведінку.

2. Код закритий для модифікації

Клас, що використовує залежність, не змінюється. Він просто викликає методи переданої стратегії.

3. Нова поведінка додається створенням нового компонента

Щоб реалізувати новий варіант поведінки, створюється новий клас, що реалізує той самий інтерфейс. Наявні класи лишаються незмінними - це і є дотримання OCP.

Приклад (стратегія оплати):

Інтерфейс поведінки:

python
class PaymentStrategy: def pay(self, amount): raise NotImplementedError

Реалізації:

python
class CardPayment(PaymentStrategy): def pay(self, amount): print("Оплата карткою:", amount) class PayPalPayment(PaymentStrategy): def pay(self, amount): print("Оплата через PayPal:", amount)

Клас, що використовує стратегію:

python
class CheckoutService: def __init__(self, payment_strategy: PaymentStrategy): self.payment_strategy = payment_strategy def process(self, amount): self.payment_strategy.pay(amount)

Розширення:

python
class CryptoPayment(PaymentStrategy): def pay(self, amount): print("Оплата криптовалютою:", amount)

Чому це OCP

  1. CheckoutService ніколи не змінюється. Він повністю закритий для модифікації.
  2. Нова поведінка додається новими стратегіями. CryptoPayment - новий клас, який не вимагає зміни наявної системи.
  3. Клієнтський код просто підставляє новий компонент. Наприклад:
python
checkout = CheckoutService(CryptoPayment()) checkout.process(100)
  1. Композиція гнучкіша за успадкування. Поведінку можна підмінювати в рантаймі, комбінувати або змінювати без створення нових ієрархій класів.

Підсумок: OCP через композицію реалізується за допомогою стратегій, делегування та ін'єкції залежностей: базовий код лишається незмінним, а нова поведінка додається створенням нових компонентів, переданих у клас ззовні.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.