php 八大设计模式-适配器模式
什么叫适配:
适配器模式其实也是一种为了解耦的设计模式,为了让客户端的调用变得更简单统一,将源接口转换为目标接口的过程封装到特定的过程中,这个过程就叫适配
目的:
适配器模式将原本不兼容的接口转换为客户期望的接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。
应用场景:
- 封装有缺陷的接口设计
- 统一多个类的接口设计,比如一个支付系统,有三种不同的支付方式,微信支付、支付宝支付、网银支付,这三种支付的实现方法都不一样,那么我们可以用适配器模式,让他们对外具有统一的方法,这样,我们在调用的时候就非常的方便。
- 兼容老版本的接口
举个例子
<?php
class User {
private $name;
function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
interface UserInterface {
function getUserName();
}
class UserInfo implements UserInterface {
protected $user;
function __construct($user) {
$this->user = $user;
}
// 新方法
public function getUserName() {
return $this->user->getName();
}
}
// 旧方法
$olduser = new User('达达');
echo $olduser->getName()."n";
// 要求换新的方法
$newuser = new UserInfo($olduser);
echo $newuser->getUserName()."n";
?>
上面没看懂,没关系,再来一个例子
<?php
/**
* 适配器模式演示代码
* Target适配目标: IDataBase接口
* Adaptee被适配者: mysql和mysqli、postgresql的数据库操作函数
* Adapter适配器 :mysql类和mysqli、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 Mysqli 适配器
*/
class Mysqli 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 Mysqli();
$client->connect($host, $username, $password, $database);
$result = $client->query("select * from db");
while ($rows = mysqli_fetch_array($result)) {
var_dump($rows);
}
$client->close();
这种是不是更好理解一些