设计模式(五)之适配器模式

适配器模式

将各类大相径庭的函数接口封装成统一的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)
相关文章
相关标签/搜索