Достигнуть открытого-закрытого принципа (SOLID) с использованием интерфейса

У меня есть несколько вариантов оплаты (Stripe, Paypal, PayUMoney и т. Д.). Я хочу создать отдельный класс для каждого типа оплаты и Платежный интерфейс быть реализованным этими классами, как это,

interface PaymentInterface {
public function payment($params);
}
class Stripe implements PaymentInterface {
public function payment($params) { ... }
}

class Paypal implements PaymentInterface {
public function payment($params) { ... }
}

Из моего основного класса я хочу использовать способ оплаты. Я отправлю данные о платеже на мой основной метод и хочу динамически определить способ оплаты.

class PaymentModule {
public function confirmPayment(Request $request){
// create an object of the payment class
// $obj = new PaymentTypeClass **(Problem is here)**
// $obj->payment($params)
}
}

Мой вопрос здесь, как я могу динамически создать связанный класс / объект оплаты и вызвать оплата() метод из основного метода?

Если я создаю объект условно, то я нарушаю принцип Open-Closed. Потому что я проверяю тип оплаты, используя Если еще затем создать объект и вызвать оплата() который может потребовать дальнейшей модификации.

1

Решение

Если я создаю объект условно, то я нарушаю принцип Open-Closed. Потому что я проверяю тип платежа, используя If … else, затем создаю объект и вызываю payment (), который может потребовать дальнейшей модификации.

Некоторый фрагмент вашего кода в конечном итоге должен будет принять пользовательский ввод и решить, какую реализацию оплаты использовать. Обычно это делается с помощью заводской объект, который может использовать if-else или карту или какой-либо другой способ вернуть вам правильный объект, и это «единственная ответственность» фабрики.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]