天天看點

PHP 實作擴充卡(Adapter)模式

擴充卡模式核心思想:把對某些相似的類的操作轉化為一個統一的“接口”(這裡是比喻的說話)--擴充卡,或者比喻為一個“界面”,統一或屏蔽了那些類的細節。擴充卡模式還構造了一種“機制”,使“适配”的類可以很容易的增減,而不用修改與擴充卡互動的代碼,符合“減少代碼間耦合”的設計原則。

    我們還可以友善的添加進 sqlite 等資料庫操作的類,“插入”擴充卡中,立即就可以用操作 mysql 和 oracle 相同的方法來操作 sqlite 資料庫了。

    //擴充卡類:

    //定義了4個操作所有資料庫的方法

PHP 實作擴充卡(Adapter)模式

<?php  

class db_adapter {  

    private $db;  

    function __construct($db_obj) {  

        $this->db = $db_obj;  

    }  

    function select_record() {  

        $this->db->select ();  

    function insert_record() {  

        $this->db->insert ();  

    function update_record() {  

        $this->db->update ();  

    function delete_record() {  

        $this->db->delete ();  

}  

//mysql 資料庫操作類:  

class mysql {  

    private $obj_mysql;  

    function __construct() {  

        $obj_mysql = ......  

        ;  

    function select() {  

        $obj_mysql->mysql_select ();  

    function insert() {  

        $obj_mysql->mysql_insert ();  

    function update() {  

        $obj_mysql->mysql_update ();  

    function delete() {  

        $obj_mysql->mysql_delete ();  

//oracle 資料庫操作類:  

class oracle {  

    private $obj_oracle;  

        $obj_oracle = ......  

        $obj_oracle->oracle_select ();  

        $obj_oracle->oracle_insert ();  

        $obj_oracle->oracle_update ();  

        $obj_oracle->oracle_delete ();  

    //操作 mysql 資料庫:  

    $obj = new db_adapter(new mysql())  

    $obj->select_record ();  

    $obj->insert_record ();  

    $obj->update_record ();  

    $obj->delete_record ();  

    //操作 oracle 資料庫:  

    $obj = new db_adapter(new oracle())  

?>  

     要求:mysql、oracle 類,有相同名字、相同個數的方法。方法内部實作了各自的操作資料庫的代碼。轉換就是在這裡完成的。

    增加新的資料庫操作:構造新的類,有相同名字、相同個數的方法。方法内部實作不被關心(被屏蔽) - 不同的資料庫實作不同。

    小缺點:新的類,可能因為疏忽,導緻方法名字不合要求、個數不同。

    為了減少出錯的可能,可以改進一下。方法就是定義一個接口,作為模闆來繼承,達到規範化。

    db_adapter 類裡的方法,隻需要使用 interface db_driver 裡函數即可。

PHP 實作擴充卡(Adapter)模式

//定義一個接口,  

interface db_driver {  

    function select();  

    function insert();  

    function update();  

    function delete();  

// 資料庫操作類,比如 mysql,oracle 必須實作 db_driver 接口的同名方法,進而進行了規範。  

class mysql implements db_driver {  

    //這裡省略的代碼同前邊的 mysql 類  

class oracle implements db_driver {  

    //這裡省略的代碼同前邊的 oracle 類  

?>