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源码看设计模式——适配器模式
定义: 将一个类的接口转换成客户期望的另外一个接口(重点理解适配的这两个字),使得接口不兼容的类可以一起工作适用场景: 已经存在的类,它的方法和需求不匹配的时候 在软件维护阶段考虑的设计模式 详解 首 ...
随机推荐
- 没有被广泛采用的box-sizing属性
在标准盒模型下设置的width和height只是内容的宽和高,但在设置了宽和高的情况下若还要设置border.margin.padding等时,会发生溢出的现象,因此需要将盒模型更改. box-siz ...
- 微信开发中的序列化json问题..
微信开发平台: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list& ...
- 关于getchar()的使用
'\n'表示换行.如果用键盘敲一下回车键的话,getchar会返回一个换行符.!='\n'意思是不等于换行符.ch应该是前边定义的一个char型变量, getchar()是一个从缓冲区获取字符的函数, ...
- 在Android源码下编译jni所需要知道的事~
以下只是自己的一些总结,欢迎讨论 通过NDK编译jni网上有很多例子,在这我只总结在Android源码下编译 1.android源码环境下编译so包,编出来的.so的包前面不会自动给添加lib,NDK ...
- 继承TabActivity后不执行onBackPressed()里的方法
// 用下面这个函数拦截子Activity的返回操作 @Override public boolean dispatchKeyEvent(KeyEvent event) { ...
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
今天运行程序是出现了this application has requested the runtime to terminate it in an unusual way. 的异常报告,以前也经常 ...
- 发个ZKW线段树板子测试一下代码高亮
是我,Long time no see --Jim 先安利 Wolves 歌手:Madilyn Bailey http://music.163.com/song/524149464 ...
- [读书笔记] Python数据分析 (四) 数组和矢量计算
Numpy:高性能计算和数学分析的基础包 ndarray, 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对数组数据进行快速运算的标准数学函数 用于读写磁盘数据的工具和用于操作内存 ...
- PHP算法之四大基础算法
前言 虽然工作中,你觉得自己并没有涉及到算法这方面的东西,但是算法是程序的核心,一个程序的好与差,关键是这个程序算法的优劣,所以对于冒泡排序.插入排序.选择排序.快速排序这四种基本算法,我想还是要掌握 ...
- (56) 解决字段设为readonly无法保存
问题描述:当一个字段设为readonly =True 后,在form表单,即使你用onchange方法改变了值但也不能保存到数据库当时.平时在这样的要求,form表单有些字段要展示给用户,但又要达到不 ...