結構型模式之適配器
結構型模式主要講述如何組合類和對象以獲取更大功能的結構,同樣,按照模式的主要用途,結構型模式也分為兩個層次:
1、結構型類模式,采用繼承機制來組合接口,java沒有多繼承功能,但是可以實現(implements)多個接口,實現了多個父接口的類便擁有了父接口的功能,GOF給出的結構型類模式只有一個,那就是Adapter(適配器)模式,適配器模式的實現還可以用對象模式,一會兒會給出例子。
2、結構型對象模式,該類型的模式不是對接口進行組合,而是描述如何對一些對象進行組合,從而實現一些新功能。因為它可以在運行時刻改變對象的組合關系,所以對象組合方式具有更大的靈活性,這是用靜態類組合所不能達到的。現在以適配器為首篇,總結一下結構型模式。
GOF對適配器下的定義為:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。比如說,A要實現一個功能,而類似的功能B已經對其進行了實現,但是A又不能直接調用B的功能,怎麽辦呢?這時可以新創建一個類,使得該類同時具有A和B的功能屬性,這樣問題不就解決了,實現方案有兩種,分別是類適配器和對象適配器,首先總結類適配器模式,結構圖如下:
因為Java不支持多繼承機制,所以將要實現的目標功能類設置為Interface類型,代碼如下:
1 package adapter; 2 3 public class Test { 4 publicView Codestatic void main(String[] args) { 5 Target target=new Adapter(); 6 target.Request(); 7 } 8 } 9 10 interface Target{ 11 public void Request(); 12 } 13 class Adaptee{ 14 public void SpecificRequest(){ 15 System.out.println("this is specific request"); 16 }17 } 18 class Adapter extends Adaptee implements Target{ 19 20 @Override 21 public void Request() { 22 // TODO Auto-generated method stub 23 super.SpecificRequest(); 24 } 25 }
使用類適配器模式有很大的限制,Java本身的單繼承的語言,如果我們要適配多個功能時該怎麽辦?若用類適配器模式的話,我們的繼承層次會很多,並且根據組合優先於繼承的準則,我們也應該盡可能少地使用繼承,下面總結對象適配器模式,結構圖如下:
對應的代碼如下:
1 package adapter; 2 public class Test { 3 public static void main(String[] args) { 4 Target target=new Adapter(new Adaptee()); 5 target.Request(); 6 } 7 } 8 interface Target{ 9 public void Request(); 10 } 11 class Adaptee{ 12 public void SpecificRequest(){ 13 System.out.println("this is specific request"); 14 } 15 } 16 class Adapter implements Target{ 17 private Adaptee adaptee; 18 public Adapter(Adaptee adaptee){ 19 this.adaptee=adaptee; 20 } 21 @Override 22 public void Request() { 23 // TODO Auto-generated method stub 24 adaptee.SpecificRequest(); 25 } 26 }View Code
對象適配器並未繼承待適配的類Adaptee,而是利用Adaptee對象直接訪問其要適配的方法,好處就是我們多種不同的源(Adaptee)適配到同一個目標中去,但是我們無法對院類的方法進行置換(Override),因為我們並未繼承Adaptee類,所以這點是做不到的,因此,要根據實際情況,分析應該采用類適配器還是對象適配器。
結構型模式之適配器