php设计模式适配器模式

简介

适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起。

其实就是通过一个转换类,这个转换类里面有一个方法,我们用这个转换方法原来的接口转换成需要的接口

UML

角色

  • Target适配目标 : 该角色定义把其他类转换为何种接口,也就是我们的期望接口。

  • Adaptee被适配者 :就是需要被适配的接口。

  • Adapter适配器:其他的两个角色都是已经存在的角色,而适配器角色是需要新建立的,它用来对Adaptee与Target接口进行适配。

应用场景

如程序数据库有关联mysql、mysqli、pdo、sqlite、postgresql等操作,而你需要根据情况换数据库操作时,可以使用适配器模式统一接口,这样代码中除了数据库配置之外,就不需要做而外的更改。

同理cache(缓存)的场景也是,无论使用memcache还是redis等,在更换的时候都会很方便,节约时间。

:在一些流行框架中都可以看到此模式,详情请自行参阅框架源码。

实现

 <?php
header('Content-Type:text/html;charset=utf-8');
/**
* 适配器模式演示代码
* Target适配目标: IDataBase接口
* Adaptee被适配者: mysql和mysql_i、postgresql的数据库操作函数
* Adapter适配器 :mysql类和mysql_i、postgresql类
*/ /**
* Interface IDatabase 适配目标,规定的接口将被适配对象实现
* 约定好统一的api行为
*/
interface IDatabase
{
// 定义数据库连接方法
public function connect($host, $username, $password, $database);
// 定义数据库查询方法
public function query($sql);
// 关闭数据库
public function close();
} /**
* Class Mysql 适配器
*/
class Mysql implements IDatabase
{
protected $connect; // 连接资源 /**
* 实现连接方法
*
* @param $host host
* @param $username 用户名
* @param $password 密码
* @param $database 数据库名
*/
public function connect($host, $username, $password, $database)
{
$connect = mysql_connect($host, $username, $password);
mysql_select_db($database, $connect);
$this->connect = $connect;
//其他操作
} /**
* 实现查询方法
*
* @param $sql 需要被查询的sql语句
* @return mi
*/
public function query($sql)
{
return mysql_query($sql);
} // 实现关闭方法
public function close()
{
mysql_close();
}
} /**
* Class Mysql 适配器
*/
class Mysql_i implements IDatabase
{
protected $connect; // 连接资源 /**
* 实现连接方法
*
* @param $host host
* @param $username 用户名
* @param $password 密码
* @param $database 数据库名
*/
public function connect($host, $username, $password, $database)
{
$connect = mysqli_connect($host, $username, $password, $database);
$this->connect = $connect;
//其他操作
} /**
* 实现查询方法
*
* @param $sql 需要被查询的sql语句
*/
public function query($sql)
{
return mysqli_query($this->connect, $sql);
} // 实现关闭
public function close()
{
mysqli_close($this->connect);
}
} /**
* Class Postgresql 适配器
*/
class Postgresql implements IDatabase
{
protected $connect; // 连接资源 /**
* 实现连接方法
*
* @param $host
* @param $username
* @param $password
* @param $database
*/
public function connect($host, $username, $password, $database)
{
$this->connect = pg_connect("host=$host dbname=$database user=$username password=$password");
//其他操作
} /**
* 实现查询方法
*
* @param $sql 需要被查询的sql语句
*/
public function query($sql)
{
// 其他操作
} // 实现关闭方法
public function close()
{ }
} /**
* 客户端使用演示
* 这里以mysql为例
* 只要模式设计好,不论有多少种数据库,实现和调用方式都是一样的
* 因为都是实现的同一个接口,所以都是可以随意切换的
*/ $host = 'localhost';
$username = 'root';
$password = 'root';
$database = 'mysql'; //$client = new Postgresql();
//$client = new Mysql();
$client = new Mysql_i();
$client->connect($host, $username, $password, $database);
$result = $client->query("select * from db");
while ($rows = mysqli_fetch_array($result)) {
var_dump($rows);
}
$client->close();

运行结果:

 array(44) {
[0]=>
string(1) "%"
["Host"]=>
string(1) "%"
[1]=>
string(4) "test"
["Db"]=>
string(4) "test"
[2]=>
string(0) ""
["User"]=>
string(0) ""
[3]=>
string(1) "Y"
["Select_priv"]=>
string(1) "Y"
[4]=>
string(1) "Y"
["Insert_priv"]=>
string(1) "Y"
[5]=>
string(1) "Y"
["Update_priv"]=>
string(1) "Y"
[6]=>
string(1) "Y"
["Delete_priv"]=>
string(1) "Y"
[7]=>
string(1) "Y"
["Create_priv"]=>
string(1) "Y"
[8]=>
string(1) "Y"
["Drop_priv"]=>
string(1) "Y"
[9]=>
string(1) "N"
["Grant_priv"]=>
string(1) "N"
[10]=>
string(1) "Y"
["References_priv"]=>
string(1) "Y"
[11]=>
string(1) "Y"
["Index_priv"]=>
string(1) "Y"
[12]=>
string(1) "Y"
["Alter_priv"]=>
string(1) "Y"
[13]=>
string(1) "Y"
["Create_tmp_table_priv"]=>
string(1) "Y"
[14]=>
string(1) "Y"
["Lock_tables_priv"]=>
string(1) "Y"
[15]=>
string(1) "Y"
["Create_view_priv"]=>
string(1) "Y"
[16]=>
string(1) "Y"
["Show_view_priv"]=>
string(1) "Y"
[17]=>
string(1) "Y"
["Create_routine_priv"]=>
string(1) "Y"
[18]=>
string(1) "N"
["Alter_routine_priv"]=>
string(1) "N"
[19]=>
string(1) "N"
["Execute_priv"]=>
string(1) "N"
[20]=>
string(1) "Y"
["Event_priv"]=>
string(1) "Y"
[21]=>
string(1) "Y"
["Trigger_priv"]=>
string(1) "Y"
}

从以上结果可看出,数据库连接以及查询语句都已经执行成功。

最新文章

  1. 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
  2. .NET 委托
  3. python调用zabbix接口实现Action配置
  4. install vim
  5. 使用.net 创建windows service
  6. Maven-搭建普通maven项目
  7. BZOJ 3752 世界树
  8. linux mysql为root用户初始化密码和改变root密码
  9. Robotium -- 使用JunitReport导出测试报告
  10. vim-配置文件
  11. [iOS] 响应式编程开发-ReactiveCocoa(一)
  12. Nordic nRF51/nRF52开发流程说明
  13. JAVA时间工具类,在维护的项目里的
  14. Codeforces519 E. A and B and Lecture Rooms
  15. opencv mat裁剪
  16. hadoop - 基础操作
  17. node之常用模块
  18. vue中的js引入图片,必须require进来
  19. 20155218 《网络对抗技术》 MAL_恶意代码分析
  20. C++标准转换运算符static_cast

热门文章

  1. [JavaEE]Hibernate 所有缓存机制详解
  2. POJ 3020 Hungary
  3. HD-ACM算法专攻系列(20)——七夕节
  4. 使用 async/ await 进行 异步 编程
  5. 利用jqueryzoom实现图片放大镜效果
  6. Android设计模式——工厂方法模式
  7. 腾讯测试工程师:你以为会打LOL就能做测试了?
  8. 从Dinnr失败看产品市场可行性认知有哪些不足
  9. Kattis - CD
  10. JQuery获取ID含有特殊字符的DOM元素