Skip to content

Latest commit

 

History

History
93 lines (87 loc) · 2.07 KB

适配器模式.md

File metadata and controls

93 lines (87 loc) · 2.07 KB

适配器模式

适配器模式: 根据客户需要, 将类的接口转换成特定样式的接口, 以解决类之间的兼容问题.

案例

我们定义了数据库接口, 希望所有类型的数据库驱动都按照该接口实现.

// 定义数据库接口
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();