设计模式(五)之适配器模式
适配器模式
将各种截然不同的函数接口封装成统一的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)
佛语:我本求心不求佛,了知三界空无物,若欲求佛但求心,只这心心心是佛
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧