适配器模式: 根据客户需要, 将类的接口转换成特定样式的接口, 以解决类之间的兼容问题.
我们定义了数据库接口, 希望所有类型的数据库驱动都按照该接口实现.
// 定义数据库接口
interface Database{
public function connect();
public function query();
public function close();
}
MySQL和PDO是按照该接口实现的
// 定义MySQL类
class Mysql implements Database{
public function connect(){
//mysql 的逻辑
};
public function query(){
//mysql 的逻辑
};
public function close(){
//mysql 的逻辑
};
}
// 定义PDO类
class Pdo implements Database{
public function connect(){
//Pdo 的逻辑
};
public function query(){
//Pdo 的逻辑
};
public function close(){
//Pdo 的逻辑
};
}
// 实例化数据库类(因为定义了数据库接口, 如果我们想切换数据库驱动, 只需要将Mysql换成Pdo)
$database = new Mysql();
$database->connect();
$database->query();
$database->close();
Oracle不是按照该接口实现的, 我们需要一个适配器类来将Oracle类进行适配
// 第三方数据库类
class Oracle {
public function oracleConnect(){
//Oracle 的逻辑
};
public function oracleQuery(){
//Oracle 的逻辑
};
public function oracleClose(){
//Oracle 的逻辑
};
}
适配器类
class Adapter implements Database {
private $adaptee;
function __construct($adaptee) {
$this->adaptee = $adaptee;
}
//这里把异类的方法转换成了 接口标准方法,下同
public function connect(){
$this->adaptee->oracleConnect();
};
public function query(){
$this->adaptee->oracleQuery();
};
public function close(){
$this->adaptee->oracleClose();
};
}
使用
$adaptee = new Oracle();
$adapter = new Adapter($adaptee);
$database = $adapter;
$database->connect();
$database->query();
$database->close();