設計模式(五)之適配器模式

適配器模式

將各類大相徑庭的函數接口封裝成統一的API。 
PHP中的數據庫操做有MySQL,MySQLi,PDO三種,能夠用適配器模式統一成一致,使不一樣的數據庫操做,統一成同樣的API。相似的場景還有cache適配器,能夠將memcache,redis,file,apc等不一樣的緩存函數,統一成一致。 
首先定義一個接口(有幾個方法,以及相應的參數)。而後,有幾種不一樣的狀況,就寫幾個類實現該接口。將完成類似功能的函數,統一成一致的方法。php

 

實現步驟:html

1.定義接口interface;及接口公用的方法mysql

2.類開始實現接口;redis

3.實例化類對象調用接口方法sql

<?php
header("Content-Type:text/html;charset=utf-8");
//意圖:將一個類的接口轉換成客戶但願的另一個接口。
//適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。
interface baseDB
{
    public function connect($host,$user,$pass,$dbname);
    public function query($sql);
    public function close();
}
//myslq實現接口
class my_sql implements baseDB
{
    protected $conn;
    public function connect($host,$user,$pass,$dbname)
    {
        $conn = mysql_connect($host,$user,$pass);
        mysql_select_db($dbname,$conn);
        $this->conn;
    }
    public function query($sql){
        return mysql_query($sql,$this->conn);
    }
    public function close(){
        mysql_close($this->conn);
    }
}
//myslq實現接口
class my_sqli implements baseDB
{
    protected $conn;
    public function connect($host,$user,$pass,$dbname)
    {
        $conn = mysqli_connect($host, $user, $pass, $dbname);
        /* 打印當前數據庫編碼 */
        $charset = $conn->character_set_name();
        printf ("打印當前數據庫編碼 %s\n", $charset);

        /* 設置編碼 utf8 */
        if (!$conn->set_charset("utf8")) {
            printf("Error loading character set utf8: %s\n", $conn->error);
        } else {
            printf("Current character set: %s\n", $conn->character_set_name());
        }

        $this->conn = $conn;
    }
    public function query($sql){
        return mysqli_query($this->conn,$sql);
    }
    public function close(){
        mysqli_close($this->conn);
    }    

  public function getLink()
  {
    return $this->conn;
  }數據庫


}
//開始實例化類對象
$db = new my_sqli();
$db->connect('127.0.0.1:3306','root','','daokr');
$query = $db->query('select username,email from ik_user');


if($query){
    while ($row = $query->fetch_row()) {
        printf ("%s (%s)\r\n", $row[0], $row[1]);// 輸出:字段
    }
}else{
    echo "查詢失敗";
}

$db->close(); //關閉後 下面語句沒法獲取到數據庫版本
$my = $db->getLink();
echo $my->server_info;緩存

?>
//輸出結果:
打印當前數據庫編碼 latin1
Current character set: utf8
氘氪網 (ikoscn@sina.cn)
愛客開源 (ikos@sina.cn)
馬六甲娃娃 (277529373@qq.com)
duokr (daokr@sina.cn)
相關文章
相關標籤/搜索