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 相关文章推荐
PHP 压缩文件夹的类代码
Nov 05 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
PHP类的反射用法实例
Nov 03 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
微信支付扫码支付php版
Jul 22 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
laravel config文件配置全局变量的例子
Oct 13 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 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的正则处理函数总结分析
2008/06/20 PHP
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
php实现异步数据调用的方法
2015/12/24 PHP
nginx 设置多个站跨域
2021/03/09 Servers
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
js下用层来实现select的title提示属性
2010/02/23 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Python 导入文件过程图解
2019/10/15 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Python分类测试代码实例汇总
2020/07/23 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
委托公证书
2014/04/08 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
美术课外活动总结
2014/07/08 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL