(一)為什么需要適配器模式
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圖
- 常見問題