PHP适配器模式

Posted by 撒得一地 on 2016年1月30日 in PHP笔记

适配器模式,可以将截然不容的函数接口封装成统一的API。通俗的理解就是将不同接口适配成统一的API接口,使得原本不兼容的接口能够一起工作。

实际应用举例,PHP的数据库操作有mysql,mysqli,pdo等,可以使用适配器模式统一成一致。类似的场景还有cache适配器,比如将memcache,redis,file,apc等不同缓存,统一成一致的接口。比如下面的数据库实例:

//首先定义一个统一接口

//在不同适配中,具体函数操作不一样,但接口一致
interface IDatabase
{
   function connect($host,$user,$passwd,$dbname);

   function query($sql);

   function close();
}

//下面定义一个用mysql操作数据库的类
class Mysql implements IDatabase
{

    protected $conn;

    function connect($host,$user,$passwd,$dbname)
    {
         $conn = mysql_connect($host,$user,$passwd);
         mysql_select_db($dbname,$conn);
         $this->conn = $conn;
     }

     function query($sql)
     {
         $res = mysql_query($sql,$this->conn);
         return $res;

      }

      function close()
      {
         mysql_close($this->conn);
       }
}

//下面使用同一个接口,但用mysqli进行数据库操作

class Mysqli implements IDatabase
{

    protected $conn;

    function connect($host,$user,$passwd,$dbname)
    {
         $conn = mysqli_connect($host,$user,$passwd,$dbname);
         $this->conn = $conn;

     }

      function query($sql)
     {
         $res = mysqli_query($this->conn,$sql);
         return $res;

      }

      function close()
      {
         mysqli_close($this->conn);
       }

}

//同理,用pdo进行数据库操作

class PDO implements IDatabase
{

      protected $conn;

      function connect($host,$user,$passwd,$dbname)
     {
          $conn = new \PDO("mysql:host=$host;dbname=$dbname",$user,$passwd);
          $this->conn = $conn;
      }

      function query($sql)
      {
          return $this->conn->query($sql);
       }

       function close()
       {
          unset($this->conn;)
        }
}

//当选择Mysql类操作时
$db = new Mysql();

//下面改成你自己的用户密码和数据库名称
$db->connect('localhost','root','root','test');
$db->query($sql);

上面就是一个完整的适配器模式的例子。首先我们约定了一个统一接口,接口定义了统一的方法,约定好后再分别去创建每一个适配器实例,而这些适配器实例都遵循一开始约定的接口规则。这样规范的好处是,被适配者通过个人情况去选择特定适配器完成对适配目标的适配。比如在上面的数据库例子中,喜欢PDO方法的,可以选择PDO类去操作数据库,而在一些版本比较低的php环境中,可能还不支持PDO,那么这些用户可以选择Mysql类去操作数据库,这样大大方便了不同用户的场景选择。

总结,适配器模式定义的角色:

Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口。

Adaptee被适配者,就是需要被适配的接口。

Adapter适配器,其他的两个角色都是已经存在的角色,而适配器角色是需要新建立的,它用来对Adaptee与Target接口进行适配。

上面的例子中

Target适配目标: IDataBase接口

Adaptee被适配者:Mysql 和Mysqli和PDO的数据库操作函数

Adapter适配器 :Mysql类和Mysqli类和PDO类

标签:

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.