php设计模式- 适配器模式

概念:适配器模式,将截然不同的函数接口封装成统一的API。实际应用举例,PHP的数据库操作有mysql、mysqli、pdo三种,可以用适配器模式统一。类似的场景还有将memcache、redis、file、apc等不同缓存函数统一成cache适配器。

适用场景:

系统要求使用现有的类,而且这些类的接口不符合系统的接口。

想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

两个类所做的事情相同或相似,但是具有不同接口。

旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有的类。

使用第三方组件,接口定义与我们的定义不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

主要角色:

Target(目标角色):定义客户端使用的与特定领域相关的接口,即我们所期待得到的。

Adaptee(源角色):需要进行适配的接口。

Adapter(适配器角色):对Adaptee的接口与Target接口进行适配。适配是本模式的核心。适配器把原接口转换成目标接口,此角色为具体类。

下面是一个数据库适配器代码模型:

1.Target

Libs/IDatabase.php

<?php
namespace Libs;
/**
* Target
*/
interface IDatabase
{
    function connect($host,$user,$pwd,$dbname);
    function query($sql);
    function close();
}


2.Adapter(对Adaptee进行适配)

Libs/Database/MySQL.php

<?php
namespace LibsDatabase;

use LibsIDatabase;
class MySQL implements IDatabase
{
    protected $conn;        
    public function connect($host,$user,$pwd,$dbname)
    {
                //mysql_connect 是Adaptee
        $conn = mysql_connect($host,$user,$pwd);
        mysql_select_db($dbname);
        $this->conn = $conn;
    }
    public function query($sql)
    {
                //mysql_query<span style="font-family: Arial, Helvetica, sans-serif;">是Adaptee</span>

        $res = mysql_query($sql,$this->conn);
        return $res;
    }
    public function close()
    {
                //mysql_close 是adaptee
        mysql_close($this->conn);
    }
    
}

Libs/Database/MySQLi.php

<?php
namespace LibsDatabase;

use LibsIDatabase;
class MySQLi implements IDatabase
{
    protected $conn;
    
    public function connect($host,$user,$pwd,$dbname)
    {
        $conn = mysqli_connect($host,$user,$pwd,$dbname);
        $this->conn = $conn;
    }
    public function query($sql)
    {
        $res = mysqli_query($this->conn,$sql);
        return $res;
    }
    public function close()
    {
        mysqli_close($this->conn);
    }

}

Libs/Database/PDO.php

 <?php

namespace LibsDatabase;

use LibsIDatabase;
class PDO implements IDatabase
{
    protected $conn;

    public function connect($host,$user,$pwd,$dbname)
    {
        $conn =  new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd);
        $this->conn = $conn;
    }
    public function query($sql)
    {
        return $this->conn->query($sql);     
    }
    public function close()
    {
         unset($this->conn);
    }

}

3.调用

$db= new LibsDatabaseMySQL();
$db->connect('localhost', 'username', 'pwd', 'test');
$db->query('show databases');
$db->close();

推荐阅读:

设计模式学习笔记-适配器模式

PHP源码阅读,PHP设计模式-胖胖的空间

原文地址:https://www.cnblogs.com/ddddemo/p/5623395.html