PHP设计模式之适配器模式代码实例


Posted in PHP onMay 11, 2015

目标:

可将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口能够一起工作。通俗的理解就是将不同接口适配成统一的API接口。

角色:

Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口。
Adaptee被适配者,就是需要被适配的接口。
Adapter适配器,其他的两个角色都是已经存在的角色,而适配器角色是需要新建立的,它用来对Adaptee与Target接口进行适配。

应用场景:

如数据操作有mysql、mysqli、pdo、sqlite、postgresql等,假若生成环境需要更换数据库时,可利用适配器模式统一接口。同理cache的场景也是,这会是更换缓存策略(memcache、redis、apc)更方便。

优势:

被适配者通过适配器完成对适配目标的适配,以达到对客户使用透明的目的。

示例代码:

//适配目标,规定的接口将被适配对象实现
interface IDatabase
{
  public function connect($host, $username, $password, $database);
  public function query($sql);
}
 
//适配器
class Mysql implements IDatabase
{
  protected $connect;
 
  public function connect($host, $username, $password, $database)
  {
    $connect = mysql_connect($host, $username, $password);
    mysql_select_db($database, $connect);
    $this->connect = $connect;
    //...
  }
 
  public function query($sql)
  {
    //...
  }
}
 
//适配器
class Postgresql implements IDatabase
{
  protected $connect;
 
  public function connect($host, $username, $password, $database)
  {
    $this->connect = pg_connect("host=$host dbname=$database user=$username password=$password");
    //...
  }
 
  public function query($sql)
  {
    //...
  }
}
 
 
//客户端使用
$client = new Postgresql();
$client->query($sql);

如上:

Target适配目标: IDataBase接口
Adaptee被适配者: mysql和postgresql的数据库操作函数
Adapter适配器 :mysql类和postgresql类

PHP 相关文章推荐
java EJB 加密与解密原理的一个例子
Jan 11 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
php实现Mysql简易操作类
Oct 11 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
php封装的mysqli类完整实例
Oct 18 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 #PHP
PHP设计模式之装饰者模式代码实例
May 11 #PHP
PHP超牛逼无限极分类生成树方法
May 11 #PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 #PHP
PHP获取当前日期和时间及格式化方法参数
May 11 #PHP
PHP借助phpmailer发送邮件
May 11 #PHP
PHP date函数常用时间处理方法
May 11 #PHP
You might like
用PHP和ACCESS写聊天室(八)
2006/10/09 PHP
缓存技术详谈―php
2006/12/14 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
JS仿Base.js实现的继承示例
2017/04/07 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
JavaScript实现省市区三级联动
2020/02/13 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
Python进程间通信用法实例
2015/06/04 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
django 修改server端口号的方法
2018/05/14 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
如何利用Python识别图片中的文字
2020/05/31 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
七年级音乐教学反思
2014/01/26 职场文书
30年同学聚会感言
2014/01/30 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
大学生自荐书范文
2015/03/05 职场文书
中标通知书格式
2015/04/17 职场文书
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android