摘要:簡介適配器模式有時候也稱包裝樣式或者包裝將一個類的接口適配成用戶所期待的。應用場景如程序數據庫有關聯等操作,而你需要根據情況換數據庫操作時,可以使用適配器模式統一接口,這樣代碼中除了數據庫配置之外,就不需要做而外的更改。
簡介
適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起。
UML 角色Target適配目標 : 該角色定義把其他類轉換為何種接口,也就是我們的期望接口。
Adaptee被適配者 :就是需要被適配的接口。
Adapter適配器:其他的兩個角色都是已經存在的角色,而適配器角色是需要新建立的,它用來對Adaptee與Target接口進行適配。
應用場景如程序數據庫有關聯mysql、mysqli、pdo、sqlite、postgresql等操作,而你需要根據情況換數據庫操作時,可以使用適配器模式統一接口,這樣代碼中除了數據庫配置之外,就不需要做而外的更改。
同理cache(緩存)的場景也是,無論使用memcache還是redis等,在更換的時候都會很方便,節約時間。
注:在一些流行框架中都可以看到此模式,詳情請自行參閱框架源碼。
實現代碼:
connect = $connect; //其他操作 } /** * 實現查詢方法 * * @param $sql 需要被查詢的sql語句 * @return mi */ public function query($sql) { return mysql_query($sql); } // 實現關閉方法 public function close() { mysql_close(); } } /** * Class Mysql 適配器 */ class Mysql_i 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 Mysql_i(); $client->connect($host, $username, $password, $database); $result = $client->query("select * from db"); while ($rows = mysqli_fetch_array($result)) { var_dump($rows); } $client->close();
運行結果:
array(44) { [0]=> string(1) "%" ["Host"]=> string(1) "%" [1]=> string(4) "test" ["Db"]=> string(4) "test" [2]=> string(0) "" ["User"]=> string(0) "" [3]=> string(1) "Y" ["Select_priv"]=> string(1) "Y" [4]=> string(1) "Y" ["Insert_priv"]=> string(1) "Y" [5]=> string(1) "Y" ["Update_priv"]=> string(1) "Y" [6]=> string(1) "Y" ["Delete_priv"]=> string(1) "Y" [7]=> string(1) "Y" ["Create_priv"]=> string(1) "Y" [8]=> string(1) "Y" ["Drop_priv"]=> string(1) "Y" [9]=> string(1) "N" ["Grant_priv"]=> string(1) "N" [10]=> string(1) "Y" ["References_priv"]=> string(1) "Y" [11]=> string(1) "Y" ["Index_priv"]=> string(1) "Y" [12]=> string(1) "Y" ["Alter_priv"]=> string(1) "Y" [13]=> string(1) "Y" ["Create_tmp_table_priv"]=> string(1) "Y" [14]=> string(1) "Y" ["Lock_tables_priv"]=> string(1) "Y" [15]=> string(1) "Y" ["Create_view_priv"]=> string(1) "Y" [16]=> string(1) "Y" ["Show_view_priv"]=> string(1) "Y" [17]=> string(1) "Y" ["Create_routine_priv"]=> string(1) "Y" [18]=> string(1) "N" ["Alter_routine_priv"]=> string(1) "N" [19]=> string(1) "N" ["Execute_priv"]=> string(1) "N" [20]=> string(1) "Y" ["Event_priv"]=> string(1) "Y" [21]=> string(1) "Y" ["Trigger_priv"]=> string(1) "Y" }
從以上結果可看出,數據庫連接以及查詢語句都已經執行成功。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22059.html
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
摘要:適配器模式只要應用于希望復用一些現存的類,但接口又與復用環境要求不一致的情況這是一種亡羊補牢的方法。首選的方法應該是重構代碼,統一接口。 定義 將某個對象的接口適配為另一個對象所期望的接口,adapter模式使原本由于接口不兼容而不能一起工作的類可以一起工作 使用場景 需要的東西在面前,但卻不能用,而短時間又無法改造它,于是就想辦法適配 系統的數據和行為都正確,但接口不符時,應該考慮...
摘要:序列文章面試之函數面試之對象面試之數組的幾個不操作面試之對比分析面試之數據結構與算法前言設計模式如果應用到項目中,可以實現代碼的復用和解耦,提高代碼質量。 showImg(https://segmentfault.com/img/bVbq2VA?w=480&h=260); 序列文章 JS面試之函數(1)JS面試之對象(2)JS面試之數組的幾個不low操作(3)JS面試之http0.9~...
閱讀 1014·2021-11-22 14:56
閱讀 975·2021-11-11 16:54
閱讀 7557·2021-09-23 11:55
閱讀 3000·2021-09-22 15:57
閱讀 2788·2021-08-27 16:25
閱讀 667·2019-08-30 15:55
閱讀 1657·2019-08-30 15:43
閱讀 1593·2019-08-30 14:23