国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java通俗易懂系列設計模式之適配器模式

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:JaJian 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

      今天看了部特工電影,里面有個(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)題而提出的。

      結構

      適配器模式包含如下角色:

      • Target:目標抽象類(lèi)
      • Adapter:適配器類(lèi)
      • Adaptee:適配者類(lèi)
      • Client:客戶(hù)類(lèi)

      適配器模式有對象適配器和類(lèi)適配器兩種實(shí)現:

      • 對象適配器(推薦)
      • 類(lèi)適配器

      類(lèi)圖

      對象適配器

      類(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ē),啦啦啦。");
          }
      }

      類(lèi)適配器實(shí)現

      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ē),啦啦啦。");
          }
      }

      對象適配器實(shí)現

      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("特工駕駛者飛機,呼呼呼。");
          }
      }

      測試demo類(lèi)

      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)對象。

      適用場(chǎng)景

      使用適配器模式時(shí)

      • 您想使用現有的類(lèi),其接口與您需要的接口不匹配。
      • 你想創(chuàng )建一個(gè)可重用的類(lèi),它與不相關(guān)或不可預見(jiàn)的類(lèi)合作,即不一定具有兼容接口的類(lèi)。
      • 你需要使用幾個(gè)現有的子類(lèi),但通過(guò)對每個(gè)子類(lèi)進(jìn)行子類(lèi)化來(lái)調整它們的接口是不切實(shí)際的。 對象適配器可以調整其父類(lèi)的接口。
      • 大多數使用第三方庫的應用程序使用適配器作為應用程序和第三方庫之間的中間層,以將應用程序與庫分離。如果必須使用另一個(gè)庫,則只需要新庫的適配器,而無(wú)需更改應用程序代碼。

      總結

      適配器模式(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):

      • 可以讓任何兩個(gè)沒(méi)有關(guān)聯(lián)的類(lèi)一起運行。
      • 提高了類(lèi)的復用。
      • 增加了類(lèi)的透明度。
      • 靈活性好。

      缺點(diǎn):

      • 過(guò)多地使用適配器,會(huì )讓系統非常零亂,不易整體進(jìn)行把握。比如,明明看到調用的是 A 接口,其實(shí)內部被適配成了 B 接口的實(shí)現,一個(gè)系統如果太多出現這種情況,無(wú)異于一場(chǎng)災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進(jìn)行重構。
      • 由于 JAVA 至多繼承一個(gè)類(lèi),所以至多只能適配一個(gè)適配者類(lèi),而且目標類(lèi)必須是抽象類(lèi)。

      以上就是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í)歡迎投稿傳遞力量。

      疯狂做受XXXX高潮欧美日本| AV片在线观看| 伊人久久综合精品无码AV专区| 久久九九日本韩国精品| 精品国产第一福利网站| 18禁亚洲深夜福利人口|