設計模式之(七)適配器模式(Adapter)

  做爲一個碼農,每天都要面對電腦。知道電腦一直在不停的升級換代。電腦的不少零件接口也不斷的變化。若是你曾經花巨資採購的一臺電腦在使用一段時間後,發現硬盤空間不夠使用,須要加一塊硬盤,在加的時候才發現新硬盤和電源線插口不匹配。這時候,網絡硬件維護人員的同事,給了你一根轉換線,一頭是舊的串行接口,一頭是新的並行接口。經過這個轉換線,完美的解決了老電源上和新的硬盤之間的不匹配問題。這裏的轉換線擔任的就是功能就是適配器模式要解決的問題。網絡

       經過上面生活中例子,進一步分析,適配器模式就是解決兩個事物,在須要對接的時候,發現二者之間是有些衝突的,不能完美的對接起來。爲了解決這個問題,就加入一個第三方事物,來解決二者不匹配問題。經過這個思路我們看看這個定義:ide

  將一個類的接口轉換成客戶客戶但願的另一個接口,適配器模式使得原來因爲接口不兼容問題不能再一塊兒對接的那些類能夠在一塊兒工做。this

  經過上面的介紹瞭解了適配器模式解決的問題場景,下面咱們就舉個例子更清晰的熟悉適配器模式。spa

  軟件公司開內部會議,須要小王和小李演示新功能,他們都解決了公司一個久未攻克的問題,一但老總承認了,會有一筆不菲的獎金。公司準備了一臺是 VGA 接口的投影儀。實現以下:設計

1 //VGA投影儀
2 public class Projector {
3     
4     public String myself = "VGA";
5     
6     public String toString(){
7         return myself;
8     }
9 }

 

   小王開始演示了,他的電腦筆記本正好有一個 VGA 接口。實現以下:code

 1 // VGA接頭的接口
 2 public interface VGAInterface {
 3     
 4     public void VGAwork(String chat);
 5     
 6 }
 7 
 8 public class VGAInterfaceImpl implements VGAInterface {
 9     private String thisObject = "VGA 接口";
10     @Override
11     public void VGAwork(String chat) {
12         // TODO Auto-generated method stub
13         // TODO Auto-generated method stub
14         if(thisObject.contains(chat)){
15             System.out.println("我是 VGA 接口,插入的是:"+chat + ",匹配");
16         }
17         else
18         {
19             System.out.println("我是 VGA 接口,插入的是:"+chat + ",不匹配");
20         }
21     }
22 }

   電腦鏈接上投影儀對象

 1 public class UseProjector {
 2     
 3     public static void main(String[] args) {
 4     
 5          Projector projector = new Projector();
 6          
 7          VGAInterface vga = new VGAInterfaceImpl();
 8          
 9          String cht = projector.toString();
10          vga.VGAwork(cht);
11     } 
12 }    

/***********************************************************/
控制檯:我是 VGA 接口,插入的是:VGA,匹配

   小王連接上了投影儀,順利進行了演示,老總很是承認,一筆獎金就要到手,小王內心爽歪歪。blog

  接下來輪到小李進行演示了,在鏈接投影儀的時候才發現本身電腦上只有 HDMI 接口, HDMI 接口 以下繼承

 1 public interface HDMIInterface {
 2 
 3     public void HDMIwork(String Chat);
 4 }
 5 
 6 public class HDMIInterfaceImpl implements HDMIInterface{
 7     private String thisObject = "HDMI 接口";
 8     @Override
 9     public void HDMIwork(String chat) {
10         // TODO Auto-generated method stub
11         if(thisObject.contains(chat)){
12             System.out.println("我是 HDMI 接口,插入的是:"+chat + ",匹配");
13         }
14         else
15         {
16             System.out.println("我是 HDMI 接口,插入的是:"+chat + ",不匹配");
17         }
18     }
19 }

  小李電腦和投影儀匹配結構是:接口

public class UseProjector {
    
    public static void main(String[] args) {
         Projector projector = new Projector();
         
        //VGAInterface vga = new VGAInterfaceImpl();
         HDMIInterface hdmi= new HDMIInterfaceImpl();
         String cht = projector.toString();
         hdmi.HDMIwork(cht);
    } 
}

/******************************************/
我是 HDMI 接口,插入的是:VGA,不匹配

  無法鏈接上投影儀。小李頓時一腦門大汗,老總那麼忙,今天不能演示的話,之後變數太大了。正當小李絕望之際,組長遞過來一根轉行線,能夠把 HDMI 接口轉換成 VGA 接口。用代碼實現以下

//轉換線  適配器類
public class Adapter extends VGAInterfaceImpl implements  HDMIInterface {
    
    // HDMI 接口轉換成 VGA
    @Override
    public void HDMIwork(String chat) {
        VGAwork(chat);
    }
}

   小李頓時喜出望外,經過轉換線,進行鏈接投影儀

public class UseProjector {
    public static void main(String[] args) {
         Projector projector = new Projector();
         
        //VGAInterface vga = new VGAInterfaceImpl();
         //HDMIInterface hdmi= new HDMIInterfaceImpl();
         Adapter adapter = new Adapter();
         String cht = projector.toString();
         adapter.HDMIwork(cht);
    } 
}

/************************************************/
我是 VGA 接口,插入的是:VGA,匹配

  小李看到結果匹配,高興一蹦多高,終於能夠順利演示了。

簡單總結

  上面這個例子就是典型的使用適配器解決了問題的例子,問題就是  投影器的 VGA 接口和 小李電腦的HDMI 接口不匹配的問題,經過用適配器模式來解決了這個問題。能夠清晰的很出來,適配器模式有一些特色:

     一、實在系統擴展過程或者添加的,不是在系統開發過程當中設計的。

     二、能夠在系統擴展後,盡最大可能複用原來的代碼

   三、一個系統若是使用適配器模式太多,就會形成混亂。

適配器實現方式

  適配器的實現方式有兩種:類適配器、對象適配器。

       類適配器:繼承被適配的對象的類,而後實現須要適配成目標類的接口 。被適配對象類 : Adaptee,適配目標的對象的接口:Target。

public class Adapter extends Adaptee implements Target{
     public void work(){
           Adaptee_work();
    }  
}

       對象適配器:實現須要適配成目標類的接口 。被適配的類當成一個屬性。實現以下

 1 public class Adapter  implements  Target{
 2      // 被適配類
 3      private Adaptee adaptee;
 4 
 5      public Adapter(Adaptee adaptee){
 6            this.adaptee = adaptee;
 7      }
 8 
 9      public void work(){
10            adaptee.Adaptee_work();
11     }  
12 }

  對象適配器和類適配器的區別就是:對象適配器能夠適配多個類,而類適配器只能適配繼承的那個類。而類適配器則能夠部分重定義 被適配類的 部分行爲。

雙向適配器

  雙適配器,那就那上面的例子來講。HDMI 接口能夠轉換成 VGA口,那麼確定也能夠把 VGA 口轉換成爲 HDMI 口。在適配類中實現了二者的相互轉換,就是雙向適配器。

  例子上面的例子中,若是在顯示前,VGA 接口的投影儀換了,換成了 HDMI 接口的投影儀,那麼就須要把 VGA 接口轉換成 HDMI 了,再考慮上面那種狀況,這就是使用到雙向適配器的地方了。下面來完善下代碼

 1 //上面的例子演進的雙適配器
 2 public class TwoAdapter implements VGAInterface,HDMIInterface {
 3 
 4     public TwoAdapter(VGAInterfaceImpl VGA){
 5         this.VGA = VGA;
 6     }
 7     
 8     public TwoAdapter(HDMIInterfaceImpl HDMI){
 9         this.HDMI = HDMI;
10     }
11     
12     private VGAInterfaceImpl VGA;
13     
14     private HDMIInterface HDMI;
15     
16         // HDMI 轉化 VGA
17     @Override
18     public void HDMIwork(String chat) {
19         // TODO Auto-generated method stub
20         VGA.VGAwork(chat);
21     }
22         // VGA 轉化 HDMI
23     @Override
24     public void VGAwork(String chat) {
25         // TODO Auto-generated method stub
26         HDMI.HDMIwork(chat);
27     }
28 }    

        雙向適配器用的是對象適配器,也就是利用了對象適配器能夠匹配多個 Adatee 的優點來完成的。

 小結

       適配器模式的適用範圍是擴展或對接系統接口,並且是在有衝突不能再一塊兒無缺對接起來時候用到的。而不是在系統開發設計之初用到的模式。現實方式包括:對象適配器、類適配器、雙向適配器,其實雙向適配器是對象適配器的一種。

  說了這麼多,總結起來適配器的本質就是:轉換匹配,複用功能。

相關文章
相關標籤/搜索