设计模式(五)之适配器模式
适配器模式
将各种截然不同的函数接口封装成统一的API。
PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。
首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。
实现步骤:
1.定义接口interface;及接口公用的方法
2.类开始实现接口;
3.实例化类对象调用接口方法
<?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)
佛语:我本求心不求佛,了知三界空无物,若欲求佛但求心,只这心心心是佛