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模拟HTTP认证
Oct 09 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
PHP eval函数使用介绍
Dec 08 PHP
php+mysql实现无限分类实例详解
Jan 15 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
js代码实现微博导航栏
Jul 30 PHP
详解php的socket通信
Aug 11 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 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 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP学习记录之数组函数
2018/06/01 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
建筑施工实习自我鉴定
2013/09/19 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
消防安全标语
2014/06/07 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
质量保证书格式模板
2015/02/27 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
python中的random模块和相关函数详解
2022/04/22 Python