在适配器模式中,我们通过增加一个新的适配器类来办理接口不兼容的问题,使得原来没有任何关系的类可以协同事情。
根据适配器类与适配者类的关系不同,适配器模式可分为工具适配器和类适配器两种,在工具适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继续(或实现)关系。
意图
将一个类的接口转换成客户希望的其余一个接口。适配器模式使得原来由于接口不兼容而不能一起事情的那些类可以一起事情。
办理问题
紧张办理在软件系统中,常常要将一些"现存的工具"放到新的环境中,而新环境哀求的接口是现工具不能知足的。
UML图
该模式中包含的角色及其职责
目标抽象类(Target)
当前系统业务所期待的接口,它可以是抽象类或接口,定义适配器要实现的方法。
被适配者(Adaptee)角色
它是一个转换器,通过继续或引用适配者的工具,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者,要被适配的类。
适配器(Adapter)角色
它是被访问和适配的现存组件库中的组件接口,Target 和 Adaptee 之间的桥梁,实现Adaptee到Target转换。
在本例子中:
优缺陷
优点
将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修正原有代码。增加了类的透明性和复用性,将详细的实现封装在适配者类中,对付客户端类来说是透明的,而且提高了适配者的复用性。灵巧性和扩展性都非常好,通过利用配置文件,可以很方便地改换适配器,也可以在不修正原有代码的根本上增加新的适配器类,完备符合“开闭原则”。缺陷
要重定义Adaptee的行为比较困难,这种情形下,须要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源须要额外的引用来间接得到Adaptee。运用处景
系统须要利用现有的类,而这些类的接口不符合系统的须要。想要建立一个可以重复利用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起事情。案例背景
一个网站对接多个支付平台的支付接口、SDK,如果没有不采取适配器我们在做支付的时候须要不才单的地方进行判断,把各个支付平台要求api代码,如果有一天须要新增一个支付办法,我们只要新增一个适配器就好了。
在付款的时候只要通过不同的适配器针对 PayTarget 接口来编程即可,这样我们在实现不同厂家的支付接口只要写一个适配器就可以搞定了。
示例代码
PayTarget.php 目标抽象类Target,紧张用于规定适配器要实现的接口
interface PayTarget{ public function pay();}
Alipay.php 要被适配的Adaptee
class Alipay{ public function precreate(){ echo "支付宝支付\n"; }}
WechatPay.php 要被适配的Adaptee
class WechatPay{ public function unifiedorder(){ echo "微信支付\n"; }}
AlipayAdapter.php 支付宝支付的适配器Adapter
class AlipayAdapter implements PayTarget{ private $alipay; / AlipayAdapter constructor. @param $alipay / public function __construct(Alipay $alipay){ // 通报一个要被适配的类工具 $this->alipay = $alipay; } public function pay(){ // 调用要被适配的类的方法 $this->alipay->precreate(); }}
WechatPayAdapter.php 微信支付的适配器Adapter
class WechatPayAdapter implements PayTarget{ private $wechatPay; / WechatPayAdapter constructor. @param $wechatPay / public function __construct(WechatPay $wechatPay){ // 通报一个要被适配的类工具 $this->wechatPay = $wechatPay; } public function pay(){ // 调用要被适配的类的方法 $this->wechatPay->unifiedorder(); }}
调用代码:
$alipay = new Alipay();$target = new AlipayAdapter($alipay);$target->pay();//输出结果:支付宝支付$wechatPay = new WechatPay();$target1 = new WechatPayAdapter($wechatPay);$target1->pay();//输出结果:微信支付
输出结果:
支付宝支付微信支付
更多文章关注:IT不是挨踢
如果以为文章还不错,请把文章分享给更多的人学习,在文章中创造有误的地方也希望各位指出更正。现有误的地方也希望各位指出更正。