介绍
适配器模式是作为两个不兼容的接口之间的桥梁,这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能.它可以将不同的API封装成统一的API,例如数据库操作有mysql
,mysqli
,pdo
三种,使用适配器模式使其统一成一致的.
优缺点
优点
- 可以让任何多个没有关联的类一起运行.
- 提高了类的复用.
- 增加了类的透明度.
- 灵活性好.
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握.比如:明明看到调用的是 A 接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难.
- 由于至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类.
演示
接口定义
以操作数据库演示.首先创建Tools\AdaptorDatabase.php
定义接口的连接,操作,关闭方法. 当类实现该接口如不实现定义的三种方法是会报错的.
<?php
namespace Tools;
interface AdaptorDatabase
{
// 定义连接数据库(ip,用户名,密码,数据库,端口号)
function connect($host,$user,$pwd,$db,$port=3306);
// 定义执行操作
function query($sql);
// 定义关闭连接
function close();
}
Mysqli
创建Tools\Databas\Mysqli.php
文件并实现AdaptorDatabase接口
<?php
namespace Tools\Database;
use Tools\AdaptorDatabase;
class Mysqli implements AdaptorDatabase
{
protected $link;
// 连接数据库
function connect($host, $user, $pwd, $db, $port = 3306)
{
// TODO: Implement connect() method.
$this->link = mysqli_connect($host, $user, $pwd, $db);
}
// 执行sql
function query($sql)
{
// TODO: Implement query() method.
// 执行并转换结果集为数组
return $res = mysqli_query($this->link, $sql);
}
// 关闭数据库
function close()
{
// TODO: Implement close() method.
mysqli_close($this->link);
}
}
PDO
创建Tools\Databas\Pdo.php
文件并实现AdaptorDatabase接口
<?php
namespace Tools\Database;
use Tools\AdaptorDatabase;
class Pdo implements AdaptorDatabase
{
protected $link;
// 连接数据库
function connect($host, $user, $pwd, $db, $port = 3306)
{
// TODO: Implement connect() method.
$this->link = new \PDO("mysql:host=$host;dbname=$db", $user, $pwd);
}
// 执行sql
function query($sql)
{
// TODO: Implement query() method.
return $this->link->query($sql);
}
// 关闭数据库
function close()
{
// TODO: Implement close() method.
unset($this->link);
}
}
使用
<?php
namespace App\Controller\Index;
use Tools\Database\Mysqli;
use Tools\Database\Pdo;
class Index
{
...
public function orders()
{
// $db = new Mysqli();
$db = new Pdo();
$db->connect('127.0.0.1','root','root','test');
$data = $db->query('select * from orders');
$db->close();
foreach ($data as $v){
print_r($v);
}
}
}