设为首页 收藏本站
查看: 1818|回复: 0

[经验分享] PHP 实现适配器(Adapter)模式

[复制链接]

尚未签到

发表于 2017-4-3 09:13:54 | 显示全部楼层 |阅读模式
  适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。
  以下示例,用接近伪码的 PHP 语法,演示了一个数据库操作的适配器类,它可以操作 MySQL 和 Oracle 数据库,但使用了相同的方法。由于使用了适配器(Adapter)模式,我们不必关心 MySQL 和 Oracle 数据库操作类的不同。
  我们还可以方便的添加进 SQLite 等数据库操作的类,“插入”适配器中,立即就可以用操作 MySQL 和 Oracle 相同的方法来操作 SQLite 数据库了。
  //适配器类:
//定义了4个操作所有数据库的方法
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;
  function __construct()
{
$obj_oracle = ......;
}
  function select()
{
$obj_oracle->oracle_select();
}
  function insert()
{
$obj_oracle->oracle_insert();
}
  function update()
{
$obj_oracle->oracle_update();
}
  function delete()
{
$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())
$obj->select_record();
$obj->insert_record();
$obj->update_record();
$obj->delete_record();
  要求:MySQL、Oracle 类,有相同名字、相同个数的方法。方法内部实现了各自的操作数据库的代码。转换就是在这里完成的。
  增加新的数据库操作:构造新的类,有相同名字、相同个数的方法。方法内部实现不被关心(被屏蔽) - 不同的数据库实现不同。
  小缺点:新的类,可能因为疏忽,导致方法名字不合要求、个数不同。
为了减少出错的可能,可以改进一下。方法就是定义一个接口,作为模板来继承,达到规范化。
  db_adapter 类里的方法,只需要使用 interface db_driver 里函数即可。
  //定义一个接口,
interface Db_driver
{
function select();
function insert();
function update();
function delete();
}
  数据库操作类,比如 MySQL,Oracle 必须实现 db_driver 接口的同名方法,从而进行了规范。
  class Mysql implements Db_driver
{
private $obj_mysql;
  function __construct()
{
$obj_mysql = ......;
}
…… //这里省略的代码同前边的 MySQL 类
}
  class Oracle implements Db_driver
{
private $obj_oracle;
  function __construct()
{
$obj_oracle = ......;
}
…… //这里省略的代码同前边的 Oracle 类
}
  代码测试环境:
操作系统:Windows Server 2003
Web服务器:Apache2.2.8
PHP 版本:5.2.5
  作者:张庆(网眼) 西安 PHP 教育培训中心 2010-8-2
来自“网眼视界”:http://blog.why100000.com
作者微博:http://t.qq.com/zhangking
“十万个为什么”电脑学习网:http://www.why100000.com

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359403-1-1.html 上篇帖子: php采集器分析功能实现 下篇帖子: PHP常用的一些基本函数(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表