PHP适配器模式
下一篇: PHP反射类 ReflectionClass
适配器模式,可以将截然不容的函数接口封装成统一的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类
下一篇: PHP反射类 ReflectionClass