(一)为什么需要适配器模式
1,某个操作数据库的有两套不同的数据库操作方法,我们通过适配器统一成一个接口。例如,我们待会把mysql和mysqli统一成一个接口。
2,我们有多套数据库对应了多种数据库操作,例如MySQL,SqlServer,Oralce,Redis都有对应的操作函数,或操作类。PDO把这些都统一成一个接口。
3,系统的增加一些新功能,创建了一个新的接口,但是老的接口并不想废弃。可以使用适配器模式,对用户隐藏这两个接口,提供用户所希望的接口。
```
<?php
//MySQL待操作适配类
class MySQLAdaptee implements Target
{
protected $conn; //用于存放数据库连接句柄
//实现连接方法
public function connect($host, $user, $passwd, $dbname)
{
$conn = mysql_connect($host, $user, $passwd);
mysql_select_db($dbname, $conn);
$this->conn = $conn;
}
//查询方法
public function query($sql)
{
$res = mysql_query($sql, $this->conn);
return $res;
}
//关闭方法
public function close()
{
mysql_close($this->conn);
}
}
//MySQLi操作待适配类
class MySQLiAdaptee
{
protected $conn;
public function connect($host, $user, $passwd, $dbname)
{
$conn = mysqli_connect($host, $user, $passwd, $dbname);
$this->conn = $conn;
}
public function query($sql)
{
return mysqli_query($this->conn, $sql);
}
public function close()
{
mysqli_close($this->conn);
}
}
//用户所期待的接口
Interface Target{
public function connect($host, $user, $passwd, $dbname);
public function query($sql);
public function close();
}
//用户期待适配类
Class DataBase implements Target {
protected $db ; //存放MySQLiAdapter对象或MySQLAdapter对象
public function __construct($type){
$type = $type."Adapter" ;
$this->db = new $type ;
}
public function connect($host, $user, $passwd, $dbname){
$this->db->connect($host, $user, $passwd, $dbname);
}
public function query($sql){
return $this->db->query($sql);
}
public function close(){
$this->db->close();
}
}
//用户调用同一个接口,使用MySQL和mysqli这两套不同示例。
$db1 = new DataBase('MySQL');
$db1->connect('127.0.0.1','root','1234','myDB');die;
$db1->query('select * from test');
$db1->close();
$db2 = new DataBase('MySQLi');
$db2->connect('127.0.0.1','root','1234','myDB');
$db2->query('select * from test');
$db2->close();
```
场景描述
比如现在有一个支付工具Paypal,通过调用$Paypal->sendPayment($amount)就可以进行支付,但是过了一段时间,这个调用方法名称改变了,或者是改用其它支付工具,显然将每个调用到这个方法的代码都改动一次是不太现实的,这个时候就可以考虑使用适配器模式进行封装;
```
<?php
class Paypal
{
public function sendPayMent($amount)
{
echo "pay by Paypal:".$amount."<br>";
}
}
class Skrill
{
public function doPayment($amount)
{
echo "pay bySkrill:".$amount."<br>";
}
}
class Adapter
{
private $adapter;
public function __construct($adaptee)
{
$this->adapter = $adaptee;
}
public function send($amount)
{
if ($this->adapter == 'Paypal') {
$send = new Paypal();
$send->sendPayMent($amount);
}
if ($this->adapter == 'Skrill') {
$send = new Skrill();
$send->doPayment($amount);
}
}
}
$paypal = new Adapter('Paypal');
$paypal->send(50);
```
- 空白目录
- 安装
- linux下安装nginx
- linux下安装php
- 调试
- windows 安装wamp
- 常用源
- 类型
- Boolean布尔类型
- Integer整型
- Float浮点型
- String字符串
- Array数组
- Object对象
- Resource资源类型
- NULL
- Callback/Callable类型
- 类型转换
- 变量
- 预定义变量
- 常量
- 魔术常量(预定义常量)
- 语法
- 运算符
- 流程控制
- 条件语句
- if
- else
- else if/elseif
- switch
- 循环语句
- while
- do-while
- for
- foreach
- break
- return
- continue
- require
- include
- require_once
- include_once
- 函数
- 内置函数
- 匿名函数
- 自定义函数
- 类与对象
- 属性
- 声明
- public
- protected
- private
- 类常量
- 方法
- 魔术方法
- __construct()
- __destruct()
- __call()
- __callStatic()
- __get()
- __set()
- __isset()
- __unset()
- __sleep()
- __wakeup()
- __toString()
- __invoke()
- __set_state()
- __clone()
- __debugInfo()
- 方法的调用
- ->(对象运算符)
- ::(范围解析操作符)
- 设计模式
- 依赖注入
- call_user_func
- is_callable (
- 创建型模式
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 结构性模式
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 行为型模式
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
- 命令模式
- 备忘录模式
- 访问者模式
- 中介者模式
- 解释器模式
- 六大原则
- uml语言
- 反射
- 类型约束
- 调试
- lamp
- lnmp
- composer
- 工作常用
- UML图
- 常见问题