PHP教程

php设计模式之适配器模式(Adapter)

本文主要是介绍php设计模式之适配器模式(Adapter),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • php设计模式之适配器模式(Adapter)
    • 实例

php设计模式之适配器模式(Adapter)

当对象不太符合要求的时候,给他加一个适配器呗!!(这个模式一直以来都有一个很经典的例子,那就是插座!没错,当我们从国外买回来电器,或者旅游出差去国外的时候,经常会需要一个电源适配器,因为我国的电压标准是220伏,而其他国家则有110伏的标准。而这个电源适配器正是适配器模式的一种标志。)

实例

各位大拿在对接信息、支付类的接口时,经常会使用这些平台提供的SDK。特别是有了Composer之后,安装SDK就更加的方便了,但是,又有一个严重的问题,这帮人做的SDK虽说功能实现大同小异,但命名可是千差万别啊!!我们的系统原来一直使用的阿里云的业务,但是这回要增加极光和百度云的信息功能,一来做个后备,二来根据不同业务使用不同的接口达到安全或节约的目的,有没有办法统一一下他们对外的接口,让我们使用他们的SDK时能够非常方便的和之前使用大家都已经很习惯的阿里云的接口一样呢?当然有,给他们各自都上个适配器呗,实例化的时候大不了外面再套个工厂返回不同的适配器就好啦,只要适配器里的实现方法和阿里云一样就OK啦!

<?php

class Message{
    public function send(){
        echo "阿里云发送短信!" . PHP_EOL;
    }
    public function push(){
        echo "阿里云发送推送!" . PHP_EOL;
    }
}

class JiguangSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->send_out_msg();
    }
    public function push(){
        $this->message->push_msg();
    }
}

class JiguangMessage{
    public function send_out_msg(){
        echo "极光发送短信!" . PHP_EOL;
    }
    public function push_msg(){
        echo "极光发送推送!" . PHP_EOL;
    }
}
class BaiduYunSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->transmission_msg();
    }
    public function push(){
        $this->message->transmission_push();
    }
}
class BaiduYunMessage{
    public function transmission_msg(){
        echo "百度云发送短信!" . PHP_EOL;
    }
    public function transmission_push(){
        echo "百度云发送推送!" . PHP_EOL;
    }
}

$jiguangMessage = new JiguangMessage();
$baiduYunMessage = new BaiduYunMessage();
$message = new Message();

// 原来的老系统发短信,使用阿里云
$message->send();
$message->push();


// 部分模块用极光发吧
$jgAdatper = new JiguangSDKAdapter($jiguangMessage);
$jgAdatper->send();
$jgAdatper->push();

// 部分模块用百度云发吧
$bdAatper = new BaiduYunSDKAdapter($baiduYunMessage);
$bdAatper->send();
$bdAatper->push();

说明

  • 在这个例子中,我们有两个适配器,因为有两个SDK需要我们去适配,谁说只能有一个电源转换器,万一哪个神奇的国度是用500伏的电压呢,所以还是多带个电源转换器吧
  • 这里我们是继承的Message类,因为Message类是之前已经写好的代码,里面可能有一些可以公用的方法,所以并没有做接口抽象。可以考虑在重构代码的时候实现提取一个抽象接口,但在这里只是为了演示适配器不一定只是能去针对接口,只要和原对象保持一致,不去继承什么也是可以的,毕竟我们是弱类型语言,如果是类似于Java的强类型,那么继承或者实现还是很有必要的(多态性)
  • 组合式的适配器与装饰器类似,都会维护一个外部对象,装饰器更多的会使用原来的类中的方法,对其进行增加功能的操作,而适配器则很少去增加功能,而是直接替换掉
  • 当你想使用一个类,但他提供的内容跟你的业务又不太匹配的时候;或者你想创建一个类,可以与其他不相关的类或不可预见的类协同工作的时候,不妨试试适配器模式吧

链接:https://juejin.cn/post/6844903925800239111

这篇关于php设计模式之适配器模式(Adapter)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!