这是我看的一篇博客顺便记录原文地址(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
类就可以了。