1. 程式人生 > >結構型模式之適配器

結構型模式之適配器

generate 對象模式 spa public 接口 int specific 一個 private

結構型模式主要講述如何組合類和對象以獲取更大功能的結構,同樣,按照模式的主要用途,結構型模式也分為兩個層次:

1、結構型類模式,采用繼承機制來組合接口,java沒有多繼承功能,但是可以實現(implements)多個接口,實現了多個父接口的類便擁有了父接口的功能,GOF給出的結構型類模式只有一個,那就是Adapter(適配器)模式,適配器模式的實現還可以用對象模式,一會兒會給出例子。

2、結構型對象模式,該類型的模式不是對接口進行組合,而是描述如何對一些對象進行組合,從而實現一些新功能。因為它可以在運行時刻改變對象的組合關系,所以對象組合方式具有更大的靈活性,這是用靜態類組合所不能達到的。現在以適配器為首篇,總結一下結構型模式。

GOF對適配器下的定義為:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。比如說,A要實現一個功能,而類似的功能B已經對其進行了實現,但是A又不能直接調用B的功能,怎麽辦呢?這時可以新創建一個類,使得該類同時具有A和B的功能屬性,這樣問題不就解決了,實現方案有兩種,分別是類適配器和對象適配器,首先總結類適配器模式,結構圖如下:

技術分享

因為Java不支持多繼承機制,所以將要實現的目標功能類設置為Interface類型,代碼如下:

技術分享
 1 package adapter;
 2 
 3 public class Test {
 4     public
static 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 }
View Code

使用類適配器模式有很大的限制,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類,所以這點是做不到的,因此,要根據實際情況,分析應該采用類適配器還是對象適配器。

結構型模式之適配器