php 八大设计模式-适配器模式

什么叫适配:

适配器模式其实也是一种为了解耦的设计模式,为了让客户端的调用变得更简单统一,将源接口转换为目标接口的过程封装到特定的过程中,这个过程就叫适配

目的:

适配器模式将原本不兼容的接口转换为客户期望的接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。

 

应用场景:

  1. 封装有缺陷的接口设计
  2. 统一多个类的接口设计,比如一个支付系统,有三种不同的支付方式,微信支付、支付宝支付、网银支付,这三种支付的实现方法都不一样,那么我们可以用适配器模式,让他们对外具有统一的方法,这样,我们在调用的时候就非常的方便。
  3. 兼容老版本的接口

 

举个例子

<?php 
class User {      
    private $name;      

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

    public function getName() {      
        return $this->name;      
    }

}

interface UserInterface {

    function getUserName();

} 


class UserInfo implements UserInterface {      
    protected $user;

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

    // 新方法
    public function getUserName() {
        return $this->user->getName();      
    }

}  

// 旧方法
$olduser = new User('达达');      
echo $olduser->getName()."n";      


// 要求换新的方法
$newuser = new UserInfo($olduser);      
echo $newuser->getUserName()."n";

 ?>

上面没看懂,没关系,再来一个例子

<?php
/**
 * 适配器模式演示代码
 * Target适配目标: IDataBase接口
 * Adaptee被适配者: mysql和mysqli、postgresql的数据库操作函数
 * Adapter适配器 :mysql类和mysqli、postgresql类
 */

/**
 * Interface IDatabase 适配目标,规定的接口将被适配对象实现
 * 约定好统一的api行为
 */
interface IDatabase {
    // 定义数据库连接方法
    public function connect($host, $username, $password, $database);
    // 定义数据库查询方法
    public function query($sql);
    // 关闭数据库
    public function close();
}

/**
 * Class Mysql 适配器
 */
class Mysql implements IDatabase {
    protected $connect; // 连接资源

    /**
     * 实现连接方法
     *
     * @param $host host
     * @param $username 用户名
     * @param $password 密码
     * @param $database 数据库名
     */
    public function connect($host, $username, $password, $database)
    {
        $connect = mysql_connect($host, $username, $password);
        mysql_select_db($database, $connect);
        $this->connect = $connect;
        //其他操作
    }

    /**
     * 实现查询方法
     *
     * @param $sql 需要被查询的sql语句
     * @return mi
     */
    public function query($sql)
    {
        return mysql_query($sql);
    }

    // 实现关闭方法
    public function close()
    {
        mysql_close();
    }
}

/**
 * Class Mysqli 适配器
 */
class Mysqli implements IDatabase {
    protected $connect; // 连接资源

    /**
     * 实现连接方法
     *
     * @param $host host
     * @param $username 用户名
     * @param $password 密码
     * @param $database 数据库名
     */
    public function connect($host, $username, $password, $database)
    {
        $connect = mysqli_connect($host, $username, $password, $database);
        $this->connect = $connect;
        //其他操作
    }

    /**
     * 实现查询方法
     *
     * @param $sql 需要被查询的sql语句
     */
    public function query($sql)
    {
        return mysqli_query($this->connect, $sql);
    }

    // 实现关闭
    public function close()
    {
        mysqli_close($this->connect);
    }
}

/**
 * Class Postgresql 适配器
 */
class Postgresql implements IDatabase
{
    protected $connect; // 连接资源

    /**
     * 实现连接方法
     *
     * @param $host
     * @param $username
     * @param $password
     * @param $database
     */
    public function connect($host, $username, $password, $database)
    {
        $this->connect = pg_connect("host=$host dbname=$database user=$username password=$password");
        //其他操作
    }

    /**
     * 实现查询方法
     *
     * @param $sql 需要被查询的sql语句
     */
    public function query($sql)
    {
        // 其他操作
    }

    // 实现关闭方法
    public function close()
    {

    }
}


/**
 * 客户端使用演示
 * 这里以mysql为例
 * 只要模式设计好,不论有多少种数据库,实现和调用方式都是一样的
 * 因为都是实现的同一个接口,所以都是可以随意切换的
 */

$host = 'localhost';
$username = 'root';
$password = 'root';
$database = 'mysql';

//$client = new Postgresql();
//$client = new Mysql();
$client = new Mysqli();
$client->connect($host, $username, $password, $database);
$result = $client->query("select * from db");
while ($rows = mysqli_fetch_array($result)) {
    var_dump($rows);
}
$client->close();

这种是不是更好理解一些

 

posted @ 2021-06-07 09:11  方达达  阅读(173)  评论(0编辑  收藏  举报