当前位置: 首页 > 后端技术 > PHP

PHP设计模式之适配器模式

时间:2023-03-29 18:48:36 PHP

这种模式一直以来都有一个很经典的例子,那就是socket!没错,当我们从国外购买电器,或者出国旅游时,往往需要一个电源适配器,因为我们国家的电压标准是220伏,而其他国家是110伏的标准。而这个电源适配器就是适配器模式的标志。当对象不符合要求时,给他加一个适配器!!Gof类图及解释GoF定义:将一个类的接口转换成客户想要的另一个接口。Adapter模式让那些因为接口不兼容而无法协同工作的类可以协同工作GoF类图继承组合代码实现interfaceTarget{functionRequest():void;}定义一个接口契约,也可以是一个普通的类实现方法(我们将在以下示例中使用一个类)classAdapterimplementsTarget{private$adaptee;函数__constuct($adaptee){$this->adaptee=$adaptee;}functionRequest():void{$this->adaptee->SpecificRequest();}}适配器实现了这个接口契约,从而可以实现Request()方法,但是请注意,我们真正调用的其实是Adaptee类中的方法classAdaptee{functionSpecificRequest():void{echo"I'm中国标准!";}}适配器有两种形式,如上面的类图所示。我们代码实现的组合形式的继承形式在GoF书上以C++为例,因为C++可以实现多重继承,但是现在流行的语言大多都是接口的形式,也可以实现,但是使用这种形式的适配器并不多。其实就是一种面向接口编程的思想,类似于装饰器对旧函数的包装。我们这里是直接替换,但是对外调用还是一样的。适配器模式其实很好理解。代码真的只有这么小。说到我的手机厂,这次我们的生意真的是长起来了。!它已销往泰国、新加坡和印度尼西亚。总之,哪里有咖喱,哪里就有我们。据说我们做了咖喱色。外壳的变化并不完全是受诺基亚的影响,但经过长期的研究,我们发现不同的颜色在不同的地方卖得更好。因此,福X康在原来的手机壳生产线(Target)上安装了喷涂适配器(adapter)。当我们需要其他颜色的手机壳时,只需要这个适配器更换不同的油漆(适配器),直接安装这个喷涂机,一款新的彩色手机就诞生了。当我们将业务扩展到另一个国家时,我们只需要更换油漆即可。如果我们用的时间太长,我们甚至可以更换喷头(还记得打印机的不间断供应吗?)信息和支付接口,你会经常用到这些平台提供的SDK。尤其是有了Composer,安装SDK就更方便了。然而,还有一个严重的问题。这些人做的SDK虽然功能大同小异,但是命名却大相径庭!!我们的系统一直使用阿里云的业务,这次需要加入极光和百度云的资讯功能。首先,它会是一个备份,其次,我们会根据不同的业务使用不同的接口,以达到安全或节省的目的。有什么办法吗?统一他们对外的接口,让我们在使用他们的SDK的时候,可以很方便的使用之前大家用惯的阿里云的同一个接口?当然有,而且每个都有适配器。实例化的时候,大不了在外面建立一个工厂,返回一个不同的适配器。只要adapter里面的实现方式和阿里云的一样就OK!短信发送类图完整源码:短信发送适配器方法message=$message;}publicfunctionsend(){$this->message->send_out_msg();}publicfunctionpush(){$this->message->push_msg();}}classJiguangMessage{publicfunctionsend_out_msg(){echo"极光发送短信!".PHP_EOL;}publicfunctionpush_msg(){echo"极光发送推送!".PHP_EOL;}}classBaiduYunSDKAdapterextendsMessage{private$信息;公共函数__construct($message){$this->message=$message;}publicfunctionsend(){$this->message->transmission_msg();}publicfunctionpush(){$this->message->transmission_push();}}classBaiduYunMessage{publicfunctiontransmission_msg(){echo"百度云短信!".PHP_EOL;}publicfunctiontransmission_push(){echo"百度云推送!".PHP_EOL;}}$jiguangMessage=newJiguangMessage();$baiduYunMessage=newBaiduYunMessage();$message=newMessage();//原来老系统发短信,用阿里云$message->send();$message->push();//部分模块使用极光发送$jgAdatper=newJiguangSDKAdapter($jiguangMessage);$jgAdatper->send();$jgAdatper->push();//部分模块使用百度云发送$bdAatper=newBaiduYunSDKAdapter($baiduYunMessage);$bdAatper->send();$bdAatper->push();说明一下这个例子,我们有两个适配器,因为有两个SDK需要适配,谁说电源转换器只能一个,万一哪个神奇的国家用的是500伏,那就多带一个电源转换器吧。这里我们继承了Message类,因为Message类是之前写好的代码,里面可能有一些常用的。方法,所以没有接口抽象重构代码时可以考虑抽取一个抽象接口,不过这里只是为了演示,适配器不一定只针对接口,只要和原来的对象一致,不继承任何东西也是可以的。毕竟我们是弱类型语言,如果是类似Java的强类型,那么继承或者实现还是有必要的(多态)。组合适配器类似于装饰器,会维护一个外部对象,装饰器会更多地使用原有类的方法为其添加功能,而适配器很少添加功能,而是直接替换Laravel中的Filesystem模块。有一个FilesystemAdapter类。我觉得没什么好说的。很明显的告诉大家我们用到了适配器模式,大家仔细研究一下。当您想使用某个课程,但它提供的内容与您的业务不匹配时;或者你想创建一个可以与其他不相关的类或不可预见的类一起工作的类时,不妨试试适配器模式。下期活动订阅你听说过吗?不?如果说地震是一个事件,那么一旦灾难发生,各个政府部门和社会团队就会立即开始行动,抢险救灾等各项工作也会立即展开。我们可以把整个社会力量看成是订阅者,包括我们自己。大家会很关心灾区的情况。在这里,我们都是旁观者。现在观察者模式就很容易理解了,我们下一节再详细说!============各媒体平台均可搜索【硬核项目经理】