摘要:你眼中的適配器是什么樣子的呢在設計模式中也有模式叫適配器模式,一起來看看吧。定義適配器模式將一個類的接口,轉換成客戶期待的另一個接口。
你眼中的適配器是什么樣子的呢?在設計模式中也有模式叫適配器模式,一起來看看吧。
適配器是什么這不需要作者我多解釋把,打個比方,在國內用的是220V的電器,但國外有些國家是110V甚至240V的也有等等,國內的充電線就不能直接插國外的插座了,這時候就需要一個適配器做電源轉換,是的,在設計模式中也有這么一個模式與其類似,也是個很有用的模式。
下面我做了幾個配圖來理解設計模式。
假設已有一個系統,此時它需要更新,你希望它能和新的廠商類庫搭配使用,但是這個新廠商設計出來的接口,與原系統的接口不一樣。所以兩者不能直接匹配。
若重構原來的代碼可能會非常麻煩,而且又不能去改變廠商的代碼,怎么辦呢?這是你可以寫一個類,將新廠商接口轉換為你所期待的接口。
那么這個適配器就好比一個中間人,它將客戶所發送的請求轉換成廠商類能夠理解的請求。
直接放一個例子,假如一只火雞想要“冒充”成鴨子怎么做呢?
代碼如下:
這是鴨子接口
package duck_Interface; /** * 適配器模式:就好比在中國的電器若要在美國的插座上使用,就必須使用適配器, * 適配器就相當于一個中間層,將兩個原本不能相互溝通的東西連接在一起 * * @author Joy * */ public interface Duck { public void quack(); public void fly(); }
綠頭鴨是鴨子的子類
package duck_Implements; import duck_Interface.Duck; public class MallardDuck implements Duck { /** * 綠頭鴨 */ @Override public void quack() { System.out.println("綠頭鴨叫:呱呱呱"); } @Override public void fly() { System.out.println("我在飛"); } }
這是一只火雞(接口)
package duck_Interface; /** * 火雞接口 * * @author Joy * */ public interface Turkey { // 火雞只會咯咯咯叫 public void gobble(); // 火雞會飛,但飛不遠 public void fly(); }
這是火雞的一個具體實現
package duck_Implements; import duck_Interface.Turkey; public class WildTurkey implements Turkey { /** * 火雞類的實現 */ @Override public void gobble() { System.out.println("火雞叫:咯咯咯"); } @Override public void fly() { System.out.println("我會飛,但飛不高"); } }
很顯然兩者一開始不能直接匹配,這里寫一個火雞適配器
package Adapter; import duck_Interface.Duck; import duck_Interface.Turkey; /** * 火雞的適配器 * * @author Joy * */ // 先要實現想要轉換的類型接口,(火雞希望和綠頭鴨交流) // 火雞:被適配者,鴨子:適配者 // 這里火雞要實現鴨子接口 public class TurkeyAdapter implements Duck { Turkey turkey; // 需要取得適配的對象引用 // 利用構造器取得這個引用 public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public void quack() { // 現在我們需要實現火雞里的叫的方法 // 很簡單只需直接引用 turkey.gobble(); } /** * 這里由于火雞的飛行距離短,鴨子飛行距離長, 為兩者飛行能夠對應, 這里得多次調用火雞飛行方法,相當于火雞5次飛行的距離等于一次鴨子飛行的距離。。 */ @Override public void fly() { for (int i = 0; i < 5; i++) { turkey.fly(); } } }
測試類
package TestMain; import Adapter.TurkeyAdapter; import duck_Implements.MallardDuck; import duck_Implements.WildTurkey; import duck_Interface.Duck; public class DuckTestDrive { // 取得一只鴨子 public static void testDuck(Duck duck) { duck.quack(); duck.fly(); } public static void main(String[] args) { // 創建好一只鴨子和火雞 MallardDuck duck = new MallardDuck(); WildTurkey turkey = new WildTurkey(); // 然后將火雞“包裝”進火雞適配器中,讓它看上起像只鴨子 Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println("這只火雞說~~~~~"); turkey.gobble(); turkey.fly(); System.out.println(" 這只鴨子說a~~~~~"); testDuck(duck); // 試著傳入一個假裝是鴨子的火雞對象 System.out.println(" 火雞適配器說~~~~~"); /** * testDuck()方法不知道這是一只假裝鴨子的火雞 turkey調用叫的方法是“咯咯咯” * 而fly方法調用了5次,就為了讓火雞假裝成鴨子一樣飛的遠 */ testDuck(turkeyAdapter); } }
效果圖
TurkeyAdapter里的quack方法被調用,適配器咯咯咯的叫,然后fly方法被調用,適配器執行了5次飛行操作,而在testDuck(Duck duck)它還以為參數duck真的是一鴨子,其實是只假裝鴨子的火雞(turkeyAdapter)。
讓我們再看看各部分之間的關系。
客戶使用適配器的過程如下:
1、客戶通過目標接口調用適配器的方法對適配器發出請求。
2、適配器(鴨子)使用被適配器(火雞)接口把請求轉換成被適配器的一個或多個調用接口。
3、客戶接收到調用的結果,但并未察覺這一切是適配器再起轉換作用。
定義適配器模式:將一個類的接口,轉換成客戶期待的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
注:細分適配器類型是有兩種的,對象適配器和類適配器,前面的火雞例子是對象適配器,而“類”適配器則需要多重繼承才能實現,而Java中是不被允許的,這里就不講述。
感謝你看到這里,適配器模式到這里就結束了,本人文筆隨便,若有不足或錯誤之處望給予指點,90度彎腰~~~很快我會發布下一個設計模式的內容,生命不息,編程不止!
參考書籍:《Head First 設計模式》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70411.html
摘要:今天分享的主題是阿里七層流量入口硬件加速探索之路。業務驅動了技術創新,年接入層在硬件加速領域邁出了第一步。三監控,對硬件加速相關的資源指標進行實時監控和報警,防患于未然。硬件加速效果上線后我們獲得了一些加速效果的數據。 摘要: Tengine在軟件層面已經有了深度的調試和優化經驗,但是在硬件層面,通用處理器(CPU)已經進入了摩爾定律,有了瓶頸。而在業務量突飛猛進的當下,如何利用硬件來...
閱讀 2472·2021-11-24 09:39
閱讀 3518·2019-08-30 15:53
閱讀 594·2019-08-29 15:15
閱讀 2903·2019-08-26 13:23
閱讀 3212·2019-08-26 10:48
閱讀 643·2019-08-26 10:31
閱讀 748·2019-08-26 10:30
閱讀 2359·2019-08-23 18:32