GoF类图
继续式
适配器方法构造类图-继续式

组合式
适配器方法构造类图-组合式
代码实现
interfaceTarget{functionRequest():void;}
定义一个接口左券,也可以是一个正常的有实现方法的类(后面的例子我们会用类)
classAdapterimplementsTarget{private$adaptee;function__constuct($adaptee){$this->adaptee=$adaptee;}functionRequest():void{$this->adaptee->SpecificRequest();}}
适配器实现这个接口左券,让Request()方法得以实现,但请把稳,我们真正调用的实在是Adaptee类中的方法
classAdaptee{functionSpecificRequest():void{echo"I'mChinaStandard!
适配器有两种形式,上方类图中给出了,我们代码实现的组合形式的继续形式的在GoF书中因此C++为示例的,由于C++可以实现多重继续,但现在盛行的大部分措辞因此接口为形式的,也可以实现,但利用这种形式的适配器不多实在还是面向接口编程的一种思维,类似于装饰器对旧功能的包装,我们这里便是直接去进行了更换,但对外的调用还是保持不变适配器模式实在很好理解,代码真的就只有这么点
";}}
又说到我的手机工厂了,这回咱们的买卖真的做大了哦!
卖到泰国、新加坡、印度尼西亚去了,反正有咖喱的地方都有我们的身影了。听说是我们出了个咖喱色。换壳这事儿可不完备是由于受到诺X亚的影响,而是真的经由长期的调研我们创造不同颜色在不同的地方销量会更好。于是,富X康在原有的手机壳生产线(Target)上为我们加装了一个喷涂适配器(adapter),当我们须要其他颜色的壳时,只须要这个适配器换不同的颜料就好啦(adaptee),直接装上这个喷涂器,新的颜色的手机就出身了。而当向其余一个国家扩展业务时,我们换颜料就行啦,用太久了弗成就连喷头也换掉(是不是想起了连供打印机)
完全代码:适配器模式
实例连续发短信,看我能编到什么时候~~~
各位大拿在对接信息、支付类的接口时,常常会利用这些平台供应的SDK。特殊是有了Composer之后,安装SDK就更加的方便了,但是,又有一个严重的问题,这帮人做的SDK虽说功能实现大同小异,但命名可是千差万别啊!
!
我们的系统原来一贯利用的阿里云的业务,但是这回要增加极光和百度云的信息功能,一来做个后备,二来根据不同业务利用不同的接口达到安全或节约的目的,有没有办法统一一下他们对外的接口,让我们利用他们的SDK时能够非常方便的和之前利用大家都已经很习气的阿里云的接口一样呢?当然有,给他们各自都上个适配器呗,实例化的时候大不了表面再套个工厂返回不同的适配器就好啦,只要适配器里的实现方法和阿里云一样就OK啦!
短信发送类图
短信发送装饰器方法
完全源码:短信发送适配器方法
<?phpclassMessage{publicfunctionsend(){echo"阿里云发送短信!
".PHP_EOL;}publicfunctionpush(){echo"阿里云发送推送!
".PHP_EOL;}}classJiguangSDKAdapterextendsMessage{private$message;publicfunction__construct($message){$this->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$message;publicfunction__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类,我以为没啥可说的了,很明显的见告大家咱用了适配器模式,好好研究一下吧当你想利用一个类,但他供应的内容跟你的业务又不太匹配的时候;或者你想创建一个类,可以与其他不干系的类或不可预见的类协同事情的时候,不妨试试适配器模式吧下期看点事宜订阅有没有听说过?没有?如果地震算一个事宜的话,那么一旦发生这个灾害了,立时会有种类政府部门和社会团队开始行动,接济、抢险等各种事情立时展开,我们可以把全体社会力量都当做是订阅者,包括我们每一个都会很关心灾区的情形。在这里,我们所有人都是不雅观察者。这下就很随意马虎理解不雅观察者模式了吧,下节我们再详述!