適配器模式有什麼用?
將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原來由於接口不兼容而不能一起工作的那此類可以一起工作
適用性
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(); ?>
博主也參考了網上一些示例,總覺得寫的也不明確,直到寫完這篇,博主依舊疑惑。不知道我的理解是否正確,看過之後的朋友還望指點一二。
好了,今兒就到這,更多深入信息可以自己去網上找,或者查看相關書籍