Devo eseguire un pagamento e ho due metodi di pagamento: FirstPayment e TokenPayment , che implementano entrambi PaymentInterface
interface PaymentInterface
{
public function pay(PaymentRequest $request);
}
In base a una condizione specifica su PaymentRequest devo scegliere se utilizzare FirstPayment di TokenPayment .
Il cliente che richiede il pagamento non dovrebbe sapere quale implementazione utilizzare.
Ho due idee a riguardo.
1) Potrei avere un'altra implementazione di PaymentInterface come
class Payment implements PaymentInterface
{
public function pay(PaymentRequest $request)
{
if ($request->isFirstPayment()) {
$this->firstPayment->pay($request);
} else {
$this->tokenPayment->pay($request);
}
}
}
dove $this->firstPayment e $this->tokenPayment sono istanze di FirstPayment e TokenPayment rispettivamente.
Quindi il client potrebbe quindi semplicemente fare
$payment->pay($paymentRequest);
2) Avere una fabbrica
class PaymentFactory
{
public static function choosePayment(PaymentRequest $request)
{
if ($request->isFirstPayment()) {
return new FirstPayment();
}
return new TokenPayment();
}
}
e usalo come
$payment = PaymentFactory::choosePayment($paymentRequest);
$payment->pay($paymentRequest);
A mio parere entrambe le opzioni hanno alcuni pro e contro ... Cosa ne pensi?