适配器模式,将截然不同的函数接口封装成统一的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 Libs\Database;
use Libs\IDatabase;
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 Libs\Database;
use Libs\IDatabase;
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 Libs\Database;
use Libs\IDatabase;
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 Libs\Database\MySQL();
$db->connect('localhost', 'username', 'pwd', 'test');
$db->query('show databases');
$db->close();
推荐阅读: