這是我看的一篇博客順便記錄原文地址(https://www.awaimai.com/patterns/adapter)
優點:API有變化,我們僅需修改客戶端依賴的適配器類就可以,不用修改、暴露第三方類本身
場景:解決類之間的兼容問題,代碼依賴一些外部的API,或者依賴一些可能會經常更改的類,那麼應該考慮用適配器模式。
例子:需要使用一個支付寶支付類
class Alipay { public function sendPayment() { echo '使用支付寶支付。'; } } // 客戶端代碼 $alipay = new Alipay(); $alipay->sendPayment();
出現問題:假設實例化Alipay類完成支付功能,這樣客戶端代碼可能很多,支付寶支付類升級爲sendpayment,我們自己需要改動地方很多
解決方案:
客戶端調用統一的類方法,我們先定義一個適配器接口
/** * 適配器接口,所有的支付適配器都需實現這個接口。 * 不管第三方支付實現方式如何,對於客戶端來說,都 * 用pay()方法完成支付 */ interface PayAdapter { public function pay(); }
在新建一個AlipayAdapter
適配器類,在pay()
中轉換Alipay
的支付功能,如下:
/** * 支付寶適配器 */ class AlipayAdapter implements PayAdapter { public function pay() { // 實例化Alipay類,並用Alipay的方法實現支付 $alipay = new Alipay(); $alipay->sendPayment(); } }
客服端使用
// 客戶端代碼 $alipay = new AlipayAdapter(); // 用pay()方法實現支付 $alipay->pay();
這樣,當Alipay
的支付方法改變,只需要修改AlipayAdapter
類就可以了。