介绍

  适配器模式是作为两个不兼容的接口之间的桥梁,这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能.它可以将不同的API封装成统一的API,例如数据库操作有mysql,mysqli,pdo三种,使用适配器模式使其统一成一致的.

优缺点

优点

  1. 可以让任何多个没有关联的类一起运行.
  2. 提高了类的复用.
  3. 增加了类的透明度.
  4. 灵活性好.

缺点:

  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握.比如:明明看到调用的是 A 接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难.
  2. 由于至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类.

演示

接口定义

  以操作数据库演示.首先创建Tools\AdaptorDatabase.php定义接口的连接,操作,关闭方法. 当类实现该接口如不实现定义的三种方法是会报错的.

<?php

namespace Tools;


interface AdaptorDatabase
{
    // 定义连接数据库(ip,用户名,密码,数据库,端口号)
    function connect($host,$user,$pwd,$db,$port=3306);
    // 定义执行操作
    function query($sql);
    // 定义关闭连接
    function close();
}

Mysqli

  创建Tools\Databas\Mysqli.php文件并实现AdaptorDatabase接口

<?php

namespace Tools\Database;

use Tools\AdaptorDatabase;

class Mysqli implements AdaptorDatabase
{
    protected $link;

    // 连接数据库
    function connect($host, $user, $pwd, $db, $port = 3306)
    {
        // TODO: Implement connect() method.
        $this->link = mysqli_connect($host, $user, $pwd, $db);
    }

    // 执行sql
    function query($sql)
    {
        // TODO: Implement query() method.
        // 执行并转换结果集为数组
        return $res = mysqli_query($this->link, $sql);

    }

    // 关闭数据库
    function close()
    {
        // TODO: Implement close() method.
        mysqli_close($this->link);
    }
}

PDO

  创建Tools\Databas\Pdo.php文件并实现AdaptorDatabase接口

<?php

namespace Tools\Database;

use Tools\AdaptorDatabase;

class Pdo implements AdaptorDatabase
{
    protected $link;

    // 连接数据库
    function connect($host, $user, $pwd, $db, $port = 3306)
    {
        // TODO: Implement connect() method.
        $this->link = new \PDO("mysql:host=$host;dbname=$db", $user, $pwd);

    }

    // 执行sql
    function query($sql)
    {
        // TODO: Implement query() method.
        return  $this->link->query($sql);
    }

    // 关闭数据库
    function close()
    {
        // TODO: Implement close() method.
        unset($this->link);
    }
}

使用

<?php

namespace App\Controller\Index;

use Tools\Database\Mysqli;
use Tools\Database\Pdo;


class Index
{
    ...
      
    public function orders()
    {
        // $db = new Mysqli();
        $db = new Pdo();
        $db->connect('127.0.0.1','root','root','test');
        $data = $db->query('select * from orders');
        $db->close();
        foreach ($data as $v){
            print_r($v);
        }
    }
}
Last modification:March 8th, 2020 at 02:46 am