- 阐述
- 场景
- 问题
- 解决
- 适配新类
PHP适配器模式就是将截然不同的函数接口封装成统一的 API。
PHP中例如 MySQL、MySQLI、PDO 可以封装成统一的API。 比如还有 支付宝支付、微信支付等,七牛对象存储、阿里对象存储等,redis、memcache 缓存函数等。
场景适配器模式,即根据客户端需要,将某个类的接口转换成特定样式的接口,以解决类之间的兼容问题。
如果我们的代码依赖一些外部的API,或者依赖一些可能会经常更改的类,那么应该考虑用适配器模式。
下面我们以集成支付宝支付功能为例。
问题假设支付宝支付类的功能如下:
/**
* 支付宝支付类
*/
class Alipay
{
public function sendPayment()
{
echo '使用支付宝支付。';
}
}
// 客户端代码
$alipay = new Alipay();
$alipay->sendPayment();
我们直接实例化Alipay类完成支付功能,这样的客户端代码可能很多。
一段时间后,如果支付宝的Alipay类升级,方法名由sendPayment()变成goPayment()会怎样?
所有用了sendPayment()的客户端代码都要改变。
如果Alipay类频繁升级,或者客户端在很多地方使用,这会是极大的工作量。
解决现在我们用适配器模式来解决。
我们在客户端和Alipay类之间加一个中间类,也就是适配器类,转换原始的Alipay为客户端需要的形式。
为让客户端能调用到统一的类方法,我们先定义一个适配器接口:
因为Alipay类我们无法控制,而且它有可能经常更新,所以我们不对它做任何修改。
我们新建一个AlipayAdapter适配器类,在pay()中转换Alipay的支付功能,如下:
这样,当Alipay的支付方法改变,只需要修改AlipayAdapter类就可以了。
有了适配器后,扩展也变得更容易了。
继续以上的例子,在支付宝的基础上,我们再增加微信支付,它与支付宝的支付方式不同,必须通过扫码才能支付。
这种情况也应该使用适配器,而不是直接使用微信的支付功能。
代码如下:
这就是适配器的扩展特性。
我们创建了一个用于处理第三方类(支付宝、微信支付)的方法,
如果它们的API有变化,我们仅需修改客户端依赖的适配器类就可以,不用修改、暴露第三方类本身。