适配器设计模式解释

时间:2015-07-11 21:27:38

标签: php adapter

以下是我理解适配器设计模式的方法

您有一个传统的支付系统:

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);
    }
}

我的问题是,为什么?为什么我们不能直接调用传统支付系统?

2 个答案:

答案 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