У меня есть несколько вариантов оплаты (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. Потому что я проверяю тип оплаты, используя Если еще затем создать объект и вызвать оплата() который может потребовать дальнейшей модификации.
Если я создаю объект условно, то я нарушаю принцип Open-Closed. Потому что я проверяю тип платежа, используя If … else, затем создаю объект и вызываю payment (), который может потребовать дальнейшей модификации.
Некоторый фрагмент вашего кода в конечном итоге должен будет принять пользовательский ввод и решить, какую реализацию оплаты использовать. Обычно это делается с помощью заводской объект, который может использовать if-else или карту или какой-либо другой способ вернуть вам правильный объект, и это «единственная ответственность» фабрики.
Других решений пока нет …