標籤:style blog http color os java strong ar 2014
什麼是適配器模式?
在電腦編程中,適配器模式(有時候也稱封裝樣式或者封裝)將一個類的介面適配成使用者所期待的。適配器能將因為介面不相容而不能在一起工作的類工作在一起,做法是將類自己的介面包裹在一個已存在的類中。
實現適配器的方式?
①對象適配器模式-- 在這種適配器模式中,適配器容納一個它包裹的類的執行個體。在這種情況下,適配器調用被包裹對象的物理實體。 ②類適配器模式-- 這種適配器模式下,適配器繼承自已實現的類(一般多重繼承)。 理論性的東西看起來就是比較煩,下面來舉個日常的小例子來更好的瞭解適配器吧
圖1:三相插頭 圖2:二孔插座 圖3:三相插頭轉二相的轉換器 看完上面三幅圖,我想大家應該都一目瞭然了,想把三相插頭插到二孔插座裡,只能中間加個轉換器,這裡我們可以簡單把它理解成我們今天要說的適配器再回過頭看看文章開始的這句話"適配器能將因為介面不相容而不能在一起工作的類工作在一起",沒錯,在兩個原本不能工作到一起的組件中間添加適配器,就可以把它們關聯起來了。 適配器模式裡面存在著3種角色:
1、目標角色(Target):也就是客戶理想中想要的介面,比如三相插頭,客戶想找的插孔就是三孔插座(目標角色)。
2、源(Adatee):現有的介面,也就是不滿足客戶想要的介面,也就是這個二孔插座(源)。
3、適配器(Adapter):能將二孔插座轉換成"三孔插座"的組件,也就是的三相插頭轉二相插頭轉化器(適配器)。 就以上面的例子,用代碼來講下適配器模式吧首先先來說下
對象適配器模式
以筆記本通電為例,大家都知道正常的筆記本電源是三相介面 ThreeSocket.java這是一個需求介面,也就是客戶期待的,也就是3種角色中的目標介面(Target)
1 package com.lcw.adapter.test;2 3 public interface ThreeSocket {4 5 //需要一個三孔插座,也就是客戶的需求6 public void needThreeSocket();7 8 }
TwoSocket.java
這是現有的組件,也就是那個二孔插座,也就是3種角色中的源(Adatee),雖然能通電,但介面是不滿足客戶的需要
1 package com.lcw.adapter.test;2 3 public class TwoSocket {4 // 現有的插座,只有二孔,已經有了供電功能,只是缺少了三孔介面5 public void serverTwo() {6 System.out.println("我是一個二孔插座,我有供電功能");7 }8 9 }
ThreeToTwoAdapter.java
這是適配器類,它需要2孔插座來提供電,並實現三孔插座,在構造方法中傳入現有組件2孔插座的對象(帶電)
1 package com.lcw.adapter.test; 2 3 public class ThreeToTwoAdapter implements ThreeSocket{ 4 private TwoSocket socket; 5 public ThreeToTwoAdapter(TwoSocket two) { 6 this.socket=two; 7 } 8 //現在已經有2孔插座的對象(意味著有通電功能) 9 @Override10 public void needThreeSocket() {11 socket.serverTwo();12 System.out.println("二孔介面已轉換成三孔介面,並注入電");13 }14 15 }
這樣一來,適配器類這個中間類就有了源(二孔插座)的效果也就是"電"
然後再實現了目標介面方法,也就是開通了三相介面,把"電"注入,這樣就可以把2個本無法一起工作的類聚集到一起,類似紅娘在它們之間牽了一條關係線
Computer.java 筆記本類,它需要的是三孔介面
1 package com.lcw.adapter.test; 2 3 public class Computer { 4 //膝上型電腦的電源插頭需求是3孔 5 private ThreeSocket three; 6 public Computer(ThreeSocket three){ 7 this.three=three; 8 } 9 public void server(){10 System.out.println("筆記本通電成功!");11 }12 13 }
來寫個測試類別
1 package com.lcw.adapter.test; 2 3 public class Test { 4 public static void main(String[] args) { 5 //現有插座兩孔,已經有提供電的功能,只是缺少3孔介面 6 TwoSocket two=new TwoSocket(); 7 //把具有通電功能的對象傳遞進去,目的是要開通3孔介面的通電功能 8 ThreeSocket three=new ThreeToTwoAdapter(two); 9 //得到一個滿足筆記本電源介面且具有電的功能對象10 Computer computer=new Computer(three);11 three.needThreeSocket();12 computer.server();13 }14 }
看下:
好了,這樣就把2個原本不能在一起工作的類連結到一起了。
接著來說下類適配器模式
類適配器顧名思義不同點在於適配器,既然突出了‘類",我們一般都會聯想到繼承
嗯,沒錯,類適配器的做法就是讓適配器去繼承已有功能(二孔插座)的類,然後再實現期望介面(三孔插座)
具體看代碼吧,除了測試類別和適配器類,其他的類與上面的保持一致,這裡就不再貼出
ThreeToTwoExtendsAdapter.java(適配器類)
1 package com.lcw.adapter.test;2 3 public class ThreeToTwoExtendsAdapter extends TwoSocket implements ThreeSocket{4 public void needThreeSocket() {5 this.serverTwo();6 System.out.println("二孔介面已轉換成三孔介面");7 }8 9 }
Test.java(測試類別)
1 package com.lcw.adapter.test; 2 3 public class Test { 4 public static void main(String[] args) { 5 //由於ThreeToTwoExtendsAdapter繼承了源,所以具有源的功能(電),並實現了3孔介面 6 ThreeSocket socket=new ThreeToTwoExtendsAdapter(); 7 //插入介面 8 Computer computer=new Computer(socket); 9 socket.needThreeSocket();10 computer.server();11 12 }13 }
效果依舊:
總結下:
①對象適配模式:
把"被適配者"作為一個對象組合到適配器中,以修改目標介面封裝被適配者。
(例如上面例子,二孔插座就是被適配者,把對象傳入適配器並實現介面方法改造)
②類適配模式:
通過多重繼承和實現介面的方式,單一的為某個類而實現適配。
適配器的作用?
1、透明:通過適配器用戶端可以調用統一介面,對於用戶端是透明的,這樣做可以更加簡潔, 直接,緊湊。
2、複用:複用了現存的類,解決因環境要求不一致的問題。
3、低耦合:將目標類與源類解耦,引入一個適配器重用源類(適配器類),遵守開放-關閉原則。
軟體設計模式之適配器模式