JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » GoF  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Design Patterns 入門 - 配接器(Adapter) [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-01-05 19:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
此文件已有新版
http://openhome.cc/Gossip/DesignPattern/

有時候您想在原來的程式中加入一個外部元件,例如一個類別,但是這個類別與您目前所設計的程式在介面上並不一致,為了讓這個外部類與原程式的介面一致,您必須使用一個類別作為中介來配接它們。

這就好比您的電腦是個舊電腦,新的滑鼠都在使用USB接口了,而您的電腦上並沒有USB,而只有一個PS2接口,這時您可以使用一個USB轉PS2的接頭作為轉換,這樣您的電腦就可以使用新滑鼠了(當然您也可以使用USB擴充卡,意思是相同的)。

配接器(Adapter)模式有兩種結構,一種是物件配接器,一種是類別配接器。我們先介紹前者,其結構如下所示:


在圖 中,Target是客戶所使用的一個目標類,圖中表示為抽象類別,在Java中您也可以定義介面作為一個完全的抽象介面,如果Target是個抽象類別,則Adapter類與其關係就是繼承,如果Target是個介面,則Adapter與其關係就是實現,要使用抽象類別或介面,必須依您的原程式來決定。

舉個例子來說,在Java 1.0中有個Enumeration,您在這個版本發行之後,使用它來設計了一個程式,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
                                                                                
class ShowMessage {
    static void simpleShow(Enumeration e) {
        Object tmp;
        while(e.hasMoreElements()) {
            tmp = e.nextElement();
            System.out.println(tmp);
        }
    }
}
                                                                                
public class Main {
    public static void main(String[] args) {
        Vector vector = new Vector();
                                                                                
        for(int i = 0; i < 10; i++)
            vector.addElement("物件 " + i);
                                                                                
        ShowMessage.simpleShow(vector.elements());
    }
}


現在Java 1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更動原來程式中已設計好的類別,這時候您可以使用配接器模式,將Iterator的介面轉換為Enumeration相容,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*;
 
class ShowMessage {
    static void simpleShow(Enumeration e) {
        Object tmp;
        while(e.hasMoreElements()) {
            tmp = e.nextElement();
            System.out.println(tmp); 
        }
    }
}
 
// 使用Adapter模式
class IterAdapter implements Enumeration {
    private Iterator iterator;
 
    IterAdapter(Iterator iterator) {
        this.iterator = iterator;    
    }
 
    // 轉接介面
    boolean hasMoreElements() {
        return iterator.hasNext();
    }
 
    Object nextElement() throws NoSuchElementException {
        return iterator.next();
    }
}
 
public class Main {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
 
        for(int i = 0; i < 10; i++)
            arrayList.add("物件 " + i);
 
        ShowMessage.simpleShow(new IterAdapter(arrayList.iterator()));
    }
}


如程式所示的,透過配接器模式,您原有程式中已設計好的類別都不用更動,就可以使用新類別的功能。

配接器模式的類別配接器結構如下所示:


這個結構是Gof中所給出的結構,Gof的書是以C++作示範,故而可以使用多重繼承來實現這個模式,然而在Java中並不能使用多重繼承,不過在一些狀況下,我們可以使用介面來完成類別配接器的結構概念,例如:


我們可以將這個例子看作:Target是個完全的抽象類,僅定義統一的介面,在這個假設下,Target就相當於Java中介面的功能,所以我們可以使用介面實作,並繼承Adaptee類來實現類別配接器模式,原始碼的實現例子如下所示:
1
2
3
public class Adapter extends Adaptee implements Target {
    // ....
}


要注意的是,這邊介紹的配接器模式,並不是Java中MouseMotionAdapter、WindowAdapter之類的模式,MouseMotionAdapter等是「預設配接器」(Default Adapter)模式,在將一個類配接至一個類的概念上雖是相同,但結構上不同,這在下一個主題中我們會談到。


caterpillar edited on 2013-04-07 15:48
reply to postreply to post
良葛格學習筆記
作者 Re:Design Patterns 入門 - 配接器(Adapter) [Re:caterpillar]
todoelie





發文: 20
積分: 0
於 2004-06-28 13:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我在練習的時候發現這段程試有點小問題…
1
2
3
4
class IterAdapter implements Enumeration 
{    
   .......
}

這兩個方法前面應該要加 public 的修飾…才行
public hasMoreElements()
public nextElement()

Smile


reply to postreply to post
若po的文章有觀念有錯,請大家指正…(y)
謝謝…(b)
作者 Re:Design Patterns 入門 - 配接器(Adapter) [Re:caterpillar]
chenchun





發文: 2
積分: 0
於 2005-06-28 10:06 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
确实要加上public

reply to postreply to post
» JWorld@TW »  Software Design » GoF

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8