以下是我理解适配器设计模式的方法
您有一个传统的支付系统:
class LegacyPaymentSystem {
public function pay($amount) {
}
public function refund() {
}
}
您实施新的付款系统:
class PaymentSystem {
public function __construct() {
}
public function payAmount($amount, $currency) {
}
public function refund($payment_id) {
}
}
您使用适配器桥接两者。有时您想使用旧的支付系统。
class PaymentSystemAdapter extends PaymentSystem {
public function __construct($legacyPaymentSystem) {
$this->legacyPaymentSystem = $legacyPaymentSystem;
}
public function payAmount($amount, $currency) {
$this->legacyPaymentSystem->pay($amount);
}
}
现在客户可以这样做:
class Client {
public function process($amount, $currency) {
$legacyPaymentSystem = new LegacyPaymentSystem();
$adapter = new PaymentSystemAdapter($legacyPaymentSystem);
$this->pay($adapter, $amount, $currency);
}
public function pay(PaymentSystem $paymentSystem, $amount, $currency) {
$payementSystem->payAmount($amount, $currency);
}
}
我的问题是,为什么?为什么我们不能直接调用传统支付系统?
答案 0 :(得分:0)
通常,Client
只应访问PaymentSystem
,并且应该不知道它正在使用的实现。
class Client {
public function process($amount, $currency) {
$paymentSystem = lookupPaymentSystem();
$payementSystem->payAmount($amount, $currency);
}
}
适配器模式允许通过向客户端公开统一接口来隐藏各种实现的细节,即使底层实现具有不同的接口。
它允许您遵循一个名为程序的设计原则来接口,而不是实现
答案 1 :(得分:0)
如果新系统接受参数作为PaymentSystem,则您不能再传递其他参数(LegacyPaymentSystem)。
在这种情况下,我们需要转换或包装对象。因此,内部我们使用的是LegacyPaymentSystem,而客户端使用的是PaymentSystem。
这是use adapter design pattern的主要原因。
有关更多详细信息,请访问learn adapter design pattern in java。