PHP 实现适配器(Adapter)模式

news/2024/7/7 11:00:38

适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

    以下示例,用接近伪码的 PHP 语法,演示了一个数据库操作的适配器类,它可以操作 MySQL 和 Oracle 数据库,但使用了相同的方法。由于使用了适配器(Adapter)模式,我们不必关心 MySQL 和 Oracle 数据库操作类的不同。

    我们还可以方便的添加进 SQLite 等数据库操作的类,“插入”适配器中,立即就可以用操作 MySQL 和 Oracle 相同的方法来操作 SQLite 数据库了。

    //适配器类:
    //定义了4个操作所有数据库的方法

Java代码   收藏代码
  1. <?php  
  2. class Db_adapter {  
  3.     private $db;  
  4.       
  5.     function __construct($db_obj) {  
  6.         $this->db = $db_obj;  
  7.     }  
  8.       
  9.     function select_record() {  
  10.         $this->db->select ();  
  11.     }  
  12.       
  13.     function insert_record() {  
  14.         $this->db->insert ();  
  15.     }  
  16.       
  17.     function update_record() {  
  18.         $this->db->update ();  
  19.     }  
  20.       
  21.     function delete_record() {  
  22.         $this->db->delete ();  
  23.     }  
  24. }  
  25.   
  26. //MySQL 数据库操作类:  
  27. class Mysql {  
  28.     private $obj_mysql;  
  29.       
  30.     function __construct() {  
  31.         $obj_mysql = ......  
  32.           
  33.         ;  
  34.     }  
  35.       
  36.     function select() {  
  37.         $obj_mysql->mysql_select ();  
  38.     }  
  39.       
  40.     function insert() {  
  41.         $obj_mysql->mysql_insert ();  
  42.     }  
  43.       
  44.     function update() {  
  45.         $obj_mysql->mysql_update ();  
  46.     }  
  47.       
  48.     function delete() {  
  49.         $obj_mysql->mysql_delete ();  
  50.     }  
  51. }  
  52.   
  53. //Oracle 数据库操作类:  
  54. class Oracle {  
  55.     private $obj_oracle;  
  56.       
  57.     function __construct() {  
  58.         $obj_oracle = ......  
  59.           
  60.         ;  
  61.     }  
  62.       
  63.     function select() {  
  64.         $obj_oracle->oracle_select ();  
  65.     }  
  66.       
  67.     function insert() {  
  68.         $obj_oracle->oracle_insert ();  
  69.     }  
  70.       
  71.     function update() {  
  72.         $obj_oracle->oracle_update ();  
  73.     }  
  74.       
  75.     function delete() {  
  76.         $obj_oracle->oracle_delete ();  
  77.     }  
  78. }  
  79.   
  80.     //操作 MySQL 数据库:  
  81.     $obj = new Db_adapter(new Mysql())  
  82.     $obj->select_record ();  
  83.     $obj->insert_record ();  
  84.     $obj->update_record ();  
  85.     $obj->delete_record ();  
  86.   
  87.     //操作 Oracle 数据库:  
  88.     $obj = new Db_adapter(new Oracle())  
  89.     $obj->select_record ();  
  90.     $obj->insert_record ();  
  91.     $obj->update_record ();  
  92.     $obj->delete_record ();  
  93. ?>  

     要求:MySQL、Oracle 类,有相同名字、相同个数的方法。方法内部实现了各自的操作数据库的代码。转换就是在这里完成的。
    增加新的数据库操作:构造新的类,有相同名字、相同个数的方法。方法内部实现不被关心(被屏蔽) - 不同的数据库实现不同。
    小缺点:新的类,可能因为疏忽,导致方法名字不合要求、个数不同。
    为了减少出错的可能,可以改进一下。方法就是定义一个接口,作为模板来继承,达到规范化。

    db_adapter 类里的方法,只需要使用 interface db_driver 里函数即可。

Java代码   收藏代码
  1. <?php  
  2. //定义一个接口,  
  3. interface Db_driver {  
  4.     function select();  
  5.     function insert();  
  6.     function update();  
  7.     function delete();  
  8. }  
  9.   
  10. // 数据库操作类,比如 MySQL,Oracle 必须实现 db_driver 接口的同名方法,从而进行了规范。  
  11. class Mysql implements Db_driver {  
  12.     private $obj_mysql;  
  13.       
  14.     function __construct() {  
  15.         $obj_mysql = ......  
  16.         ;  
  17.     }  
  18.   
  19.     //这里省略的代码同前边的 MySQL 类  
  20. }  
  21.   
  22. class Oracle implements Db_driver {  
  23.     private $obj_oracle;  
  24.       
  25.     function __construct() {  
  26.         $obj_oracle = ......  
  27.         ;  
  28.     }  
  29.   
  30.     //这里省略的代码同前边的 Oracle 类  
  31. }  
  32. ?>  

http://www.niftyadmin.cn/n/2135993.html

相关文章

什么是Git?转自https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739

Git简介 Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。 Git有什么特点&#xff1f;简单来说就是&#xff1a;高端大气上档次&#xff01; 那什么是版本控制系统&#xff1f; 如果你用Microsoft Word写过长篇大论&am…

我所熟悉的网站负载均衡技术

DNS轮循 http://hudeyong926.iteye.com/blog/1387793 DNS轮循是指将相同的域名解释到不同的IP&#xff0c;随机使用其中某台主机的技术。但其具有明显的缺 点&#xff1a;一旦某个服务器出现故障&#xff0c;即使及时修改了DNS设置&#xff0c;还是要等待足够的时间&#xff08…

Git基础(8):Git分支操作

文章目录查看分支创建分支切换分支修改分支合并分支(正常合并)合并分支(冲突合并)查看分支 git branch -v创建分支 git branch 分支名切换分支 git checkout 分支名 #切换成功后会显示切换到的分支名HEAD文件会指向分支名,切换分支的本质是指针&#xff0c;HEAD指针分支 …

AnySDK+GooglePlay对接1

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 你需要申请google开发者账号&#xff0c;缴纳25美元的保护费. 2. 注册anysdk账号(免费) 3. 其他见下文 好久没写博客要一步一来。 转载于:https://my.oschina.net/wpracker/blog/674291

docker应用篇(2):构建tesseract-ocr运行环境

文章目录前言资源准备搭建tesseract基础环境镜像将镜像上传到dockerhub将镜像发布到阿里云dockerhub上运行该镜像1. 下载语言包(需要新语种才需要执行)2. 运行使用这个镜像关于遇到的问题传送门前言 某些应用需要进行图片内容识别&#xff0c;需要构建tesseract的运行环境。资…

springboot框架(5):ocr图片转文本

文章目录前言编辑代码打包项目构造镜像发布镜像到dockerhub发布镜像到阿里云使用这个镜像前言 有时候&#xff0c;我们需要识别图片中为内容。而java识别图片需要基于特定的环境。代码已发布到Gitee&#xff1a;https://gitee.com/lengcz/springboot-ocr 编辑代码 新建spring…

跟我一起学ruby (转)

跟我一起学ruby By Tiger 注&#xff1a;本教程转载自在游戏先行者论坛&#xff0c;版权属于作者Tiger。 第一篇 第二篇 第一篇 自序 从今天起我就要开始学Ruby了。怎么样&#xff0c;没见吧&#xff1f;一个新人写教程。就凭我坚强的毅力&#xff0c;科学的自学方法&#xff0…

springboot基础(9):指定参数运行

文章目录前言虚拟机指定参数指定文件编码运行激活指定的配置文件运行项目指定参数指定文件编码运行激活指定的配置文件运行参数优先级:前言 项目中时常需要指定参数或者参数文件运行项目&#xff0c;而Springboo项目运行时指定参数&#xff0c;可以分为虚拟机指定参数和项目指…