PHP设计模式之:适配器模式入门教程

适配器模式有什么用?

 

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作

适用性

1、你想使用一个已经存在的类,而它的接口不符合你的需求
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

应用举例,例如PHP的数据库操作有MySQL、Mssql、PDO等,可以用适配器模式统一成一致。类似的场景还有cache适配器,将memcache、redis、file、apc等不同的缓存函数,统一成一致。

接下来我们以数据库操作来举例,为了编辑方便,博主就把代码都写一起了

<?php
/** 
 * PHP设计模式之适配器模式实例
 *
 */
  
/**
 * 目标角色
 * 创建一个接口文件 DataBase.php
 * 定义一个数据库接口
 * 声明方法
 */
interface IDataBase {
    public function connect($host, $user, $passwd, $dbname);
    public function query($sql);
    public function close();
}
/**
 * 源角色
 */
class Adaptee {
 
    /**
     * 源类含有的方法
     */
    public function connect($host, $user, $passwd, $dbname) {
        return 'Adaptee';
    }
}
  
/**
 * 类适配器角色
 * 创建mysql操作类文件 Mysql.php
 * 继承接口 实现接口方法
 */
class Mysql implements IDataBase {
    private $_adaptee; 
    function __construct() {  
        $this->_adaptee = new Adaptee();   
    }
    public function connect($host, $user, $passwd, $dbname){
        /**
         * code...
         * 委派调用Adaptee的connect方法
         */
        $this->_adaptee->connect($host, $user, $passwd, $dbname);
        //return 'ok';
    }
    public function query($sql){
        /**
         * code...
         */
        return 'ok';
    }
    public function close(){
        /**
         * code...
         */
        return 'ok';
    }
}
  
/**
 * 类适配器角色
 * 创建mssql操作类文件 Mssql.php
 * 继承接口 实现接口方法
 */
class Mssql implements IDataBase {
    public function connect($host, $user, $passwd, $dbname){  
        /**
         * code...
         */
        return 'ok';
    }
    public function query($sql){
        /**
         * code...
         */
        return 'ok';
    }
    public function close(){
        /**
         * code...
         */
        return 'ok';
    }
}
/**
 * 类适配器角色
 * 创建pdo操作类文件 Pdo.php
 * 继承接口 实现接口方法
 */
class Pdfo implements IDataBase {
    public function connect($host, $user, $passwd, $dbname){  
        /**
         * code...
         */
        return 'ok';
    }
    public function query($sql){
        /**
         * code...
         */
        return 'ok';
    }
    public function close(){
        /**
         * code...
         */
        return 'ok';
    }
}
/**
 * 使用
 * 这样就可以任意的在三种适配器之间进行切换
 */
$db = new Mysql();
echo $db->connect('127.0.0.1', 'root', 'root', 'test');
echo $db->query('show databases');
echo $db->close();
?>

博主也参考了网上一些示例,总觉得写的也不明确,直到写完这篇,博主依旧疑惑。不知道我的理解是否正确,看过之后的朋友还望指点一二。

好了,今儿就到这,更多深入信息可以自己去网上找,或者查看相关书籍

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 对象
, 接口
, 设计模式
, 模式
复用
,以便于您获取更多的相关知识。

时间: 2024-10-18 07:00:46

PHP设计模式之:适配器模式入门教程的相关文章

正则表达式快速入门教程

教程|快速入门|入门教程|正则 首先,让我们来了解一下究竟什么是VBScript的"正则表达式"对象,我们先来看一段程序: Function CheckExp(patrn, strng) Dim regEx, Match ' 建立变量. Set regEx = New RegExp ' 建立正则表达式. regEx.Pattern = patrn ' 设置模式. regEx.IgnoreCase = true ' 设置是否区分字符大小写. regEx.Global = True ' 设

使用Python中的线程进行网络编程的入门教程_python

引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程.进程和异步 I/O 的支持.在许多情况下,通过创建诸如异步.线程和子进程之类的高层模块,Python 简化了各种并发方法的使用.除了标准库之外,还有一些第三方的解决方案,例如 Twisted.Stackless 和进程模块.本文重点关注于使用 Python 的线程,并使用了一些实际的示例进行说明.虽然有许多很好的联机资源详细说明了线程 API,但本文尝试提供一些实际的示例,以说明一些常见的线程使用模式. 全局解释器锁 (G

DNN快速入门教程3

看过了入门教程1和2相信大家已经基本了解DNN是个什么系统以及它的功能,但是我怎么才能用DNN创建一个网站?学习DNN很多人仍然没有头绪,现在我就以一个初学者的观点来看看我们应该做些什么. 创建普通网站的基本流程 试想下我们创建普通网站的流程,我想基本就是以下5步 规划网站页面结构:根据用户需求规划出网站的页面结构,例如首页,关于,联系,新闻 .... 网页设计: 用photoshop或者firework设计网页 制作网页模板:根据设计制作网页模板或者更原始点把设计转换成一页一页的html网页,

PHP入门教程:?(问号)和:(冒号)

例如: 1 $shenhe=$val['available']?"已审核":"未审核" 经常有刚接触php的朋友问我,php中经常见到如上代码的语句,问号和冒号是什么意思,这个语句是什么意思? 其实,这就是一个if语句的缩写,C语言里的语法,条件表达式e1?e2:e3,若e1为真(非0),则此表达式的值为e2的值:若为假,则表达式的值为e3.等同于 1 2 3 4 5 6 $e="";02.if(e1){ $e=e2; } else{ $e=e3

如何在Python的Flask框架中使用模版的入门教程

  如何在Python的Flask框架中使用模版的入门教程?          概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用: microblog |-flask文件夹 |-<一些虚拟环境的文件> |-app文件夹 | |-static文件夹 | |-templates文件夹 | |-__init__.py文件 | |-views.py文件 |-tmp文件夹 |-run.py文件 以上给你介绍了在Python的Flask

数据库快速入门教程--视频

数据库快速入门教程--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240579 本课程是这个课程体系的核心之一,为软件开发人员所需数据库知识的学习教材,而不是培训一个DBA(数据库管理员),更具体的说是为Web开发程序员所需数据库知识的学习教材.基于培养程序员的目标,本课程对数据库和SQL语句的相关知识进行了深刻地阐明和分析,学习的重点是标准SQL语句的学习的掌握.常用数据库MySQL

新手必看:无线路由器设置入门教程

一.无线路由器基本 使用方法拿到手的无线路由器,连接好电源,无线路由器一般背面有5个网线插孔,其中一个颜色会与另外四个不同.如图498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' alt="新手必看:无线路由器设置入门教程" width="474" height="205" src="http://images.51cto.com/files/upload

通过Ruby on Rails和docker构建微服务架构之入门教程

说到时下的架构,免不了会涉及到微服务.而谈到微服务架构,又跟容器和Docker技术脱不了关系.虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率.   微服务可不像一般的应用,可以通过apt-get工具进行安装,大家可能会问了:我们该如何才能像安装应用一样实现这种服务呢?在很大的程度上,这个问题的答案是否定的,我们无法轻松实现这种服务.更准确的说,至少目前我们还无法实现.在一个系统中,最难修改的就是架

php中的curl使用入门教程和常见用法实例

[目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件上传 七.文件下载 八.http 验证 九.通过代理发送请求 十.发送json数据 十一.cURL批处理(multi cURL) 十二.总结 起先cURL是做为一种命令行工具设计出来的,比较幸运的是,php也支持cURL了.通过cURL这个利器,我们能在php程序中自由地发送 HTTP请求到某个url来获取