php设计模式适配器模式
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"
}
从以上结果可看出,数据库连接以及查询语句都已经执行成功。
php设计模式适配器模式的更多相关文章
- 20. 星际争霸之php设计模式--适配器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Java设计模式——适配器模式
JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...
- linkin大话设计模式--适配器模式
linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...
- 【设计模式】Java设计模式 - 适配器模式
[设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...
- [Head First设计模式]身边的设计模式——适配器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 适配器模式
用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构
- Java设计模式 - 适配器模式
概念: 将一个类的接口,转换成客户期望的另一个接口.适配器模式让原来接口不兼容的类可以在一起工作. 解决的问题: 提供类似于中间人的作用:把原本不兼容.不能一起工作的接口组合在一起,使得它们能够在一起 ...
- 24种设计模式--适配器模式【Adapter Pattern】
今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把 ...
- 结合JDK源码看设计模式——适配器模式
定义: 将一个类的接口转换成客户期望的另外一个接口(重点理解适配的这两个字),使得接口不兼容的类可以一起工作适用场景: 已经存在的类,它的方法和需求不匹配的时候 在软件维护阶段考虑的设计模式 详解 首 ...
随机推荐
- MFC exe使用C++ dll中的std::string 崩溃
VC6中 MFC exe中 new 纯C++ dll dll 崩溃 我把纯C++的 dll,用/MTd 换成/MDd.就能够了
- NumPy和Pandas常用库
NumPy和Pandas常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数 ...
- Docker Compose + Spring Boot + Nginx + Mysql
Docker Compose + Spring Boot + Nginx + Mysql 实践 我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的 ...
- DB-MySQL:MySQL NULL 值处理
ylbtech-DB-MySQL:MySQL NULL 值处理 1.返回顶部 1. MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数 ...
- 编译libvlc。。。
https://wiki.videolan.org/Win32Compile按照官网教程,安装所需工具,参考 :http://qjw.qiujinwu.com/blog/2014/12/08/cros ...
- 限制input 内部字数
当输入字数多于限定值后,输入框显示不出来多出的字符 对于input来说,innerHTML 不能查询和更改,只能用value 来 size 属性规定输入字段的宽度 size 属性定义的是可见的字符数 ...
- Android7.0打开sdacrd图片问题
1.点击item,通过intent打开指定路径的图片. 2.测试6.0,5.0正常运行代码: File file=new File(item.address): Intent intent = new ...
- Mysql command not found on mac pro
export PATH=${PATH}:/usr/local/mysql/bin If you want this to be run every time you open terminal put ...
- 安装wampserver遇到的问题及解决方案
丢失api-ms-win-crt-runtime-l1-1-0.dll 安装完wampserver,启动服务器的时候遇到一些问题,提示说缺失dll文件,如下图所示: 网上一搜,很多人出现过丢失api- ...
- 全球NTP服务器列表
全球- pool.ntp.org 欧洲- europe.pool.ntp.org 亚洲- asia.pool.ntp.org 大洋洲- oceania.pool.ntp.org 北美- north-a ...