日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP設計模式(五)適配器模式Adapter實例詳解【結構型】

瀏覽:208日期:2022-09-10 14:59:22

本文實例講述了PHP設計模式:適配器模式Adapter。分享給大家供大家參考,具體如下:

1. 概述:

接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統庫被修正;各種程序語言以及相關庫的發展和進化。

例子1:iphone4,你即可以使用UBS接口連接電腦來充電,假如只有iphone沒有電腦,怎么辦呢?蘋果提供了iphone電源適配器??梢允褂眠@個電源適配器充電。這個iphone的電源適配器就是類似我們說的適配器模式。(電源適配器就是把電源變成需要的電壓,也就是適配器的作用是使得一個東西適合另外一個東西。)

例子2:最典型的例子就是很多功能手機,每一種機型都自帶有從電器,有一天自帶充電器壞了,而且市場沒有這類型充電器可買了。怎么辦?萬能充電器就可以解決。這個萬能充電器就是適配器。

2. 問題

你如何避免因外部庫的API改變而帶來的不便?假如你寫了一個庫,你能否提供一種方法允許你軟件的現有用戶進行完美地升級,即使你已經改變了你的API?為了更好地適宜于你的需要,你應該如何改變一個對象的接口?

3. 解決方案

適配器(Adapter)模式為對象提供了一種完全不同的接口。你可以運用適配器(Adapter)來實現一個不同的類的常見接口,同時避免了因升級和拆解客戶代碼所引起的糾紛。

適配器模式(Adapter Pattern),把一個類的接口變換成客戶端所期待的另一種接口, Adapter模式使原本因接口不匹配(或者不兼容)而無法在一起工作的兩個類能夠在一起工作。又稱為轉換器模式、變壓器模式、包裝(Wrapper)器模式(把已有的一些類包裝起來,使之能有滿足需要的接口)。 考慮一下當(不是假設!)一個第三方庫的API改變將會發生什么。過去你只能是咬緊牙關修改所有的客戶代碼,而情況往往還不那么簡單。你可能正從事一項新的項目,它要用到新版本的庫所帶來的特性,但你已經擁有許多舊的應用程序,并且它們與以前舊版本的庫交互運行地很好。你將無法證明這些新特性的利用價值,如果這次升級意味著將要涉及到其它應用程序的客戶代碼。

4. 分類

共有兩類適配器模式:1.類的適配器模式(采用繼承實現)2.對象適配器(采用對象組合方式實現)

1)類適配器模式 ——適配器繼承自已實現的類(一般多重繼承)。

Adapter與Adaptee是繼承關系

1、用一個具體的Adapter類和Target進行匹配。結果是當我們想要一個匹配一個類以及所有它的子類時,類Adapter將不能勝任工作2、使得Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子集3、僅僅引入一個對象,并不需要額外的指針以間接取得adaptee2)對象適配器模式—— 適配器容納一個它包裹的類的實例。在這種情況下,適配器調用被包裹對象的物理實體。

Adapter與Adaptee是委托關系

1、允許一個Adapter與多個Adaptee同時工作。Adapter也可以一次給所有的Adaptee添加功能2、使用重定義Adaptee的行為比較困難無論哪種適配器,它的宗旨都是:保留現有類所提供的服務,向客戶提供接口,以滿足客戶的期望。即在不改變原有系統的基礎上,提供新的接口服務。

5. 適用性

以下情況使用Adapter模式:

1 • 你想使用一個已經存在的類,而它的接口不符合你的需求。2 • 你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。3 •(僅適用于對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。即僅僅引入一個對象,并不需要額外的指針以間接取得adaptee。

6. 結構

類適配器使用多重繼承對一個接口與另一個接口進行匹配,如下圖所示:

PHP設計模式(五)適配器模式Adapter實例詳解【結構型】

對象匹配器依賴于對象組合,如下圖所示:

PHP設計模式(五)適配器模式Adapter實例詳解【結構型】

7. 構建模式的組成

•目標角色(Target):— 定義Client使用的與特定領域相關的接口。• 客戶角色(Client):與符合Target接口的對象協同。• 被適配橘色(Adaptee):定義一個已經存在并已經使用的接口,這個接口需要適配。• 適配器角色(Adapte) :適配器模式的核心。它將對被適配Adaptee角色已有的接口轉換為目標角色Target匹配的接口。對Adaptee的接口與Target接口進行適配.

8. 效果

類適配器和對象適配器有不同的權衡。

類適配器

• 用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有它的子類時,類Adapter將不能勝任工作。• 使得Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子類。• 僅僅引入了一個對象,并不需要額外的指針以間接得到 Adaptee。

對象適配器則

• 允許一個Adapter與多個Adaptee—即Adaptee本身以及它的所有子類(如果有子類的話)—同時工作。Adapter也可以一次給所有的Adaptee添加功能。• 使得重定義Adaptee的行為比較困難。這就需要生成Adaptee的子類并且使得Adapter引用這個子類而不是引用Adaptee本身。

使用Adapter模式時需要考慮的其他一些因素有:

1) Adapter的匹配程度 對Adaptee的接口與Target的接口進行匹配的工作量各個Adapter可能不一樣。工作范圍可能是,從簡單的接口轉換(例如改變操作名 )到支持完全不同的操作集合。Adapter的工作量取決于Target接口與Adaptee接口的相似程度2) 可插入的Adapter 當其他的類使用一個類時,如果所需的假定條件越少,這個類就更具可復用性。如果將接口匹配構建為一個類,就不需要假定對其他的類可見的是一個相同的接口。也就是說,接口匹配使得我們可以將自己的類加入到一些現有的系統中去,而這些系統對這個類的接口可能會有所不同。 3) 使用雙向適配器提供透明操作 使用適配器的一個潛在問題是,它們不對所有的客戶都透明。被適配的對象不再兼容 Adaptee的接口,因此并不是所有 Adaptee對象可以被使用的地方它都可以被使用。雙向適配器提供了這樣的透明性。在兩個不同的客戶需要用不同的方式查看同一個對象時,雙向適配器尤其有用。

9. 實現

類適配器使用的是繼承

讓我們看看當API改變時,如何保護應用程序不受影響。

<?php/** * 類適配器模式 * @author guisu * */ /** * 目標角色 * @version 1.0 */class Target { /** * 這個方法將來有可能改進 */ public function hello(){ echo ’Hello ’; } /** * 目標點 */ public function world(){ echo ’world’; }} /** * Client 程序 * */class Client { /** * Main program. */ public static function main() { $Target = new Target(); $Target->hello(); $Target->world(); } }Client::main();?>

我們Target已經明確指出hello()方法會在未來的版本中改進,甚至不被支持或者淘汰。接下來,現在假設第二版的Target已經發布。一個全新的greet()方法代替了hello()。

<?php/** * 類適配器模式 * @author guisu * */ /** * 目標角色 * @version 2.0 */class Target { /** * 這個方法將來有可能繼續改進 */ public function greet(){ echo ’Greet ’; } /** * 目標點 */ public function world(){ echo ’world’; }}

如果我們繼續使用原來的client代碼,肯定會報錯,找不到hello方法。

針對API“升級”的解決辦法就是創建一個適配器(Adapter)。

類適配器使用的是繼承:

<?php/** * 類適配器模式 * @author guisu * */ /** * 目標角色 * @version 2.0 */interface Target { /** * 源類的方法:這個方法將來有可能繼續改進 */ public function hello(); /** * 目標點 */ public function world();} /** * 源角色:被適配的角色 */class Adaptee { /** * 源類含有的方法 */ public function world() { echo ’ world <br />’; } /** * 加入新的方法 */ public function greet() { echo ’ Greet ’; }} /** * 類適配器角色 */class Adapter extends Adaptee implements Target { /** * 源類中沒有world方法,在此補充 */ public function hello() { parent::greet(); } }/** * 客戶端程序 * */class Client { /** * Main program. */ public static function main() { $adapter = new Adapter(); $adapter->hello(); $adapter->world(); }}Client::main();?>

對象適配器使用的是委派

<?php/** * 類適配器模式 * @author guisu * */ /** * 目標角色 * @version 2.0 */interface Target { /** * 源類的方法:這個方法將來有可能繼續改進 */ public function hello(); /** * 目標點 */ public function world();} /** * 源角色:被適配的角色 */class Adaptee { /** * 源類含有的方法 */ public function world() { echo ’ world <br />’; } /** * 加入新的方法 */ public function greet() { echo ’ Greet ’; }} /** * 類適配器角色 */class Adapter implements Target { private $_adaptee; /** * construct * * @param Adaptee $adaptee */ public function __construct(Adaptee $adaptee) { $this->_adaptee = $adaptee; } /** * 源類中沒有world方法,在此補充 */ public function hello() { $this->_adaptee->greet(); } /** * 源類中沒有world方法,在此補充 */ public function world() { $this->_adaptee->world(); }}/** * 客戶端程序 * */class Client { /** * Main program. */ public static function main() { $adaptee = new Adaptee(); $adapter = new Adapter($adaptee); $adapter->hello(); $adapter->world(); }}Client::main();?>

如例中代碼所示,你可以運用適配器(Adapter)模式來避免因外部庫改變所帶來的不便——倘若向上兼容。作為某個庫的開發者,你應該獨立編寫適配器,使你的用戶更簡便地使用新版本的庫,而不用去修改他們現有的全部代碼。

GoF書中提出的適配器(Adapter)模式更傾向于運用繼承而不是組成。這在強類型語言中是有利的,因為適配器(Adapter)事實上是一個目標類的子類,因而能更好地與類中方法相結合。

了更好的靈活性,我個人比較傾向于組成的方法(特別是在結合了依賴性倒置的情況下);盡管如此,繼承的方法提供兩種版本的接口,或許在你的實際運用中反而是一個提高靈活性的關鍵。

10.適配器模式與其它相關模式

橋梁模式(bridge模式):橋梁模式與對象適配器類似,但是橋梁模式的出發點不同:橋梁模式目的是將接口部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。而對象適配器模式則意味著改變一個已有對象的接口

裝飾器模式(decorator模式):裝飾模式增強了其他對象的功能而同時又不改變它的接口。因此裝飾模式對應用的透明性比適配器更好。結果是decorator模式支持遞歸組合,而純粹使用適配器是不可能實現這一點的。

Facade(外觀模式):適配器模式的重點是改變一個單獨類的API。Facade的目的是給由許多對象構成的整個子系統,提供更為簡潔的接口。而適配器模式就是封裝一個單獨類,適配器模式經常用在需要第三方API協同工作的場合,設法把你的代碼與第三方庫隔離開來。

適配器模式與外觀模式都是對現相存系統的封裝。但這兩種模式的意圖完全不同,前者使現存系統與正在設計的系統協同工作而后者則為現存系統提供一個更為方便的訪問接口。簡單地說,適配器模式為事后設計,而外觀模式則必須事前設計,因為系統依靠于外觀??傊?,適配器模式沒有引入新的接口,而外觀模式則定義了一個全新的接口。

代理模式(Proxy )在不改變它的接口的條件下,為另一個對象定義了一個代理。

裝飾者模式,適配器模式,外觀模式三者之間的區別:

裝飾者模式的話,它并不會改變接口,而是將一個一個的接口進行裝飾,也就是添加新的功能。

適配器模式是將一個接口通過適配來間接轉換為另一個接口。

外觀模式的話,其主要是提供一個整潔的一致的接口給客戶端。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美中文| 成人午夜国产| 婷婷综合电影| 亚洲欧洲专区| 久久亚洲欧美| 亚洲精品极品| 91av一区| 欧美经典一区| 97在线精品| 国产亚洲一区二区手机在线观看 | 精品免费av| 成人午夜网址| 韩国精品主播一区二区在线观看 | 国产伊人精品| 久久午夜精品一区二区| 日本在线一区二区三区| 欧美天堂一区| 国产一区二区三区精品在线观看| 日韩精品永久网址| 一区在线免费观看| 日韩一区二区三区免费视频| 国产精品视频一区视频二区| 激情综合婷婷| 亚洲男女av一区二区| 天堂成人免费av电影一区| 在线看片日韩| 国产精品s色| 亚洲国内欧美| 日产欧产美韩系列久久99| 麻豆精品蜜桃视频网站| 久久久精品五月天| 亚洲精品福利| 久久青青视频| 蜜桃av一区二区在线观看| 国产精品1区在线| 久久久国产精品一区二区中文| 石原莉奈一区二区三区在线观看| 国产欧美高清视频在线| 久久在线视频免费观看| 巨乳诱惑日韩免费av| 国产精品男女| 亚洲午夜精品久久久久久app| 亚洲1区在线| 日韩精品dvd| 亚洲人成网站在线在线观看| 福利一区和二区| 老司机久久99久久精品播放免费| 欧美a级一区二区| 欧美日韩精品一区二区视频| 亚洲三级视频| 久久久久久婷| 亚洲人成网77777色在线播放| 精品99久久| 日韩中文字幕区一区有砖一区 | 亚洲精品欧美| 成人av三级| 欧美日韩黄网站| 激情综合网站| 欧美精品不卡| 中文字幕亚洲精品乱码| 日韩精品不卡一区二区| 日本午夜精品久久久久| 亚洲视频综合| 精品视频国产| 色8久久久久| 成人午夜国产| 麻豆精品久久久| 99综合视频| 国产在线日韩精品| 亚洲免费一区三区| 免费视频国产一区| 精品视频在线一区二区在线| 偷拍亚洲精品| 欧美久久精品一级c片| 精品国产午夜肉伦伦影院| 亚洲日韩中文字幕一区| 久久久久久久久丰满| 久久99视频| 中文字幕日韩亚洲| 欧美日韩在线观看视频小说| 免费在线观看一区| 亚洲精品亚洲人成在线观看| 欧美日韩在线二区| 麻豆成人av在线| 色8久久久久| 在线亚洲观看| 久久亚洲国产| 国产福利电影在线播放| 国产日韩欧美一区二区三区在线观看 | 日韩专区精品| 久久国产精品美女| 91成人在线| 亚洲三级毛片| 蜜桃tv一区二区三区| 国产高潮在线| 久久久久黄色| 国产伦精品一区二区三区视频| 老司机精品久久| 亚洲成人日韩| 婷婷国产精品| 欧美日韩精品免费观看视完整| 久久99国产精品视频| 日本成人精品| 日本亚洲最大的色成网站www | 91精品国产自产精品男人的天堂| 国产精品日本| 91成人精品视频| 久久男女视频| 神马午夜在线视频| 国产精品久久久久蜜臀| 久久99国产精品视频| 国产欧美一区| 91免费精品国偷自产在线在线| 蜜臀av亚洲一区中文字幕| 欧美日韩免费观看一区=区三区| 欧美日韩精品免费观看视欧美高清免费大片 | 久久一级电影| 亚洲午夜电影| 午夜精品亚洲| 亚洲一区激情| 麻豆久久精品| 亚洲一区导航| 视频一区日韩| 日韩一区二区三区精品视频第3页| 免费观看日韩电影| 首页国产欧美日韩丝袜| 视频一区二区欧美| 涩涩涩久久久成人精品| 日韩动漫一区| 欧美国产日本| 黄色在线网站噜噜噜| 亚洲www啪成人一区二区| 久久婷婷激情| 国产视频一区在线观看一区免费| 狠狠久久婷婷| 亚洲精一区二区三区| 日本午夜精品久久久久| 国产精品欧美大片| 国产一区二区三区日韩精品| 欧产日产国产精品视频| 日韩精品免费一区二区在线观看| 欧美日韩精品在线一区| 亚洲欧美日韩国产| 欧美在线观看天堂一区二区三区| 欧美国产极品| 日韩久久精品| 欧美女激情福利| 亚洲欧洲免费| 国产精品videosex极品| av中文资源在线资源免费观看| 91精品精品| 久久国产66| 国产视频网站一区二区三区| 久久久久久色 | 欧美日韩精品一区二区三区视频 | 久久中文字幕二区| 在线精品国产亚洲| 国产精品视频3p| 日韩三区免费| 免费成人在线影院| 国产探花一区在线观看| 亚洲国产福利| 国产亚洲高清视频| 欧美日韩夜夜| 亚洲精品一区三区三区在线观看| 美女国产精品| 麻豆久久久久久久| 一区二区三区四区在线看| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品s色| 蜜臀久久精品| 伊人久久亚洲| 国产中文在线播放| 天堂成人国产精品一区| 国产精品亚洲片在线播放| 国产第一亚洲| 首页国产欧美日韩丝袜| 精品国产一区二区三区av片| 激情丁香综合| 国产精品一区二区三区av麻| 999久久久国产精品| 青草综合视频| 国产一区日韩欧美| 国产精品麻豆成人av电影艾秋| 久久亚洲国产| 久久国产免费看| 亚洲激情中文| 久久99国产精品视频| 丝袜美腿成人在线| 国产精品精品国产一区二区| 国产亚洲一级| 91偷拍一区二区三区精品| 三级欧美在线一区| 国产高潮在线| 日韩欧美美女在线观看| 91精品精品| 久久在线91| 亚洲精品成a人ⅴ香蕉片| 日韩成人亚洲| 欧美国产精品|