- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java通俗易懂系列設計模式之適配器模式
今天看了部特工電影,里面有個(gè)橋段,主角在直升機上和反派生死搏斗,而飛機則是無(wú)人駕駛的狀態(tài),有墜毀的危險。生死存亡,危急時(shí)刻主角讓團隊成員去駕駛,而團隊成員很慌張地說(shuō):“Hey, man,你開(kāi)什么國際玩笑,我只拿到了汽車(chē)的駕照,飛機駕照我可沒(méi)有?…”,主角則在遠處淡定的說(shuō):“那你就當它是汽車(chē)好了”。如何讓一個(gè)開(kāi)汽車(chē)的人去駕駛直升機呢?
什么是適配器模式?
GoF中的定義:
將一個(gè)類(lèi)的接口轉換成客戶(hù)希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
通俗來(lái)講就是,我們項目中原來(lái)已經(jīng)有一個(gè)接口(Adaptee)了它具有某類(lèi)特定功能,現在需求升級新增加了一個(gè)接口(Target)具有了新功能,如何保證客戶(hù)端某個(gè)“現存對象”具有兩個(gè)接口的功能呢?
也許會(huì )說(shuō),我們可以將Target接口的功能copy到Adaptee接口或者同時(shí)實(shí)現以上兩個(gè)接口,先不說(shuō)這違反了我們的設計模式六大原則中的開(kāi)閉原則和接口隔離原則,這會(huì )造成我們需要修改實(shí)現了Adaptee接口的所有實(shí)現類(lèi),Override所有新的功能的實(shí)現,如果實(shí)現類(lèi)少還可以,而如果實(shí)現類(lèi)很多,那么這個(gè)工作量無(wú)疑是巨大而且痛苦的。
所以,適配器模式不是為新項目架構設計時(shí)而添加的,而是解決正在服役項目由于功能升級而導致接口不兼容問(wèn)題而提出的。
適配器模式包含如下角色:
適配器模式有對象適配器和類(lèi)適配器兩種實(shí)現:
駕駛汽車(chē)接口
public interface Car { void drive(); }
駕駛直升機接口
public interface Helicopter { void air(); }
駕駛汽車(chē)的特工接口實(shí)現:
public class Agent implements Car { @Override public void drive() { System.out.println("特工開(kāi)著(zhù)汽車(chē),啦啦啦。"); } }
public class ClassAdapter extends Agent implements Helicopter { @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } }
亦可以這樣寫(xiě)(不推薦):
public class ClassAdapter implements Car,Helicopter { @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } @Override public void drive() { System.out.println("特工開(kāi)著(zhù)汽車(chē),啦啦啦。"); } }
public class ObjectAdapter implements Helicopter{ private Agent agent; public ObjectAdapter(Agent agent) { this.agent = agent; } public void drive(){ this.agent.drive(); } @Override public void air() { System.out.println("特工駕駛者飛機,呼呼呼。"); } }
public class AdapterMain { public static void main(String[] args) { System.out.println("---------初始特工----------"); Agent agent = new Agent(); agent.drive(); System.out.println("---------類(lèi)適配器特工----------"); ClassAdapter adapter = new ClassAdapter(); adapter.air(); adapter.drive(); System.out.println("---------對象適配器特工----------"); ObjectAdapter classAdapter = new ObjectAdapter(agent); classAdapter.drive(); classAdapter.air(); } }
運行結果
---------初始特工----------
特工開(kāi)著(zhù)汽車(chē),啦啦啦。
---------類(lèi)適配器特工----------
特工駕駛者飛機,呼呼呼。
特工開(kāi)著(zhù)汽車(chē),啦啦啦。
---------對象適配器特工----------
特工開(kāi)著(zhù)汽車(chē),啦啦啦。
類(lèi)適配器模式:
由于適配器類(lèi)是適配者類(lèi)的子類(lèi),因此可以在適配器類(lèi)中置換一些適配者的方法,使得適配器的靈活性更強。
對象適配器模式:
一個(gè)對象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標,也就是說(shuō),同一個(gè)適配器可以把適配者類(lèi)和它的子類(lèi)都適配到目標接口。
類(lèi)適配器和對象適配器的區別是:類(lèi)適配器是繼承Adaptee類(lèi)(接口實(shí)現類(lèi)),而對象適配器是依賴(lài)Adaptee類(lèi),持有Adaptee的類(lèi)對象。
使用適配器模式時(shí)
適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁。這種類(lèi)型的設計模式屬于結構型模式,它結合了兩個(gè)獨立接口的功能。
主要解決在軟件系統中,常常要將一些"現存的對象"放到新的環(huán)境中,而新環(huán)境要求的接口是現對象不能滿(mǎn)足的。
主要實(shí)現方式:繼承或依賴(lài)(推薦)。適配器繼承或依賴(lài)已有的對象,實(shí)現想要的目標接口。
適配器不是在詳細設計時(shí)添加的,而是解決正在服役的項目的問(wèn)題。
優(yōu)點(diǎn):
缺點(diǎn):
以上就是Java通俗易懂系列設計模式之適配器模式的詳細內容,更多關(guān)于Java設計模式的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站