設計模式(Design Patterns)筆記之二:Adapter

http://dev.csdn.net/develop/article/14/14415.shtm

<?XML:NAMESPACE PREFIX = O />

前言:呵呵,從這起開始,我們換種記錄方法怎麼樣?學學人家的,寓教於樂。第一次嘗試,見笑了。^_^

定義:Adapter:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能

一起工作的那些類可以一起工作。

角色設定:
Helen,初次接觸設計模式的美女程序員(沒有BF)。
AndyTao,高手,戰鬥力達到N級,對設計模式有相當程度的瞭解。

問題的提出:
Helen埋首在公司自己的小空間裏寫着代碼,(旁白:她雖然是個美女,但是寫代碼的水平還是不錯的。)有點問

題正在埋頭苦想,這時,AndyTao從旁邊冒出來,“嗨,美女,到點了,一起吃飯吧?”“不行,我正煩着呢

!”Helen皺着眉頭說。“哇,誰,誰欺負咱們Helen???”“切,誰敢欺負我啊。”“那怎麼了?”AndyTao一

副義憤填膺的樣子(這小子,司馬昭之心)。
“沒有啦,我這裏程序不好處理。”“噢,我看看!”AndyTao不知什麼時候已經在Helen的身後了。
屏幕上一段代碼:
public class DrawCircle {
public void DrawCircle() {
……
}
   public void insert(String msg){
     System.out.println("DrawCircle insert():"+msg);
}
……
}
public class DrawAngle {
public void DrawAngle() {
……
}
   public void insert(String msg){
     System.out.println("DrawAngle insert():"+msg);
}
……
}
“我現在要在DrawCircle中調用DrawAngle的方法,可是類的已經分發出去了,不能修改,我該怎麼辦?”
看着美女皺眉頭的樣子,AndyTao一陣心痛,“這樣啊,我給你提示,再寫個Adapter類吧。”“什麼是Adapter?


“呵呵,在實際編碼過程中,由於某種需要,我們經常要將兩個毫無關係的類交互。於是我們需要進行某種修正

,修改各個類的接口,這通常不符合編碼要求,而且,如果沒有源代碼,我們又該怎麼辦?於是,我們就要用到

Adapter了,也就是適配器的意思。象你上面的程序,我們不能修改類接口,於是,我們再寫一個Adapter類。”

public class DrawAdapter extends DrawCircle {

private DrawAngle drawangle;
public DrawAdapter(DrawAngle angle) {
this.drawangle=angle;
}
public void insert(String msg) {
drawangle.insert(str);
}
……
}

“在上面代碼中,DrawAngle屬於Adaptee,是被適配者。DrawAdapter是Adapter,將Adaptee(被適配者DrawAngle)

和Target(目標DrawCircle)進行適配。實際上這是將組合方法(composition)和繼承(inheritance)方法綜合運用

的一個例子。這樣,你就無需對原來的類修改,甚至無需要知道其內部結構和源代碼。”

“上面我們說的是對象適配器(Object Adapter),它允許client和Adaptee完全無關,只有適配器知道它們兩者的

存在。另外,還有一種是類適配器(Class Adapter),它使用多重繼承來實現。象對象適配器(Object Adapter)中

,就是上個例子,DrawAdapter繼承了DrawCircle,但是,DrawAdapter同樣可以繼承DrawAngle。由於Java不支持

多重繼承,這就是說,我們的某個類必須定義爲接口(interface)。我們可以把DrawAngle定義爲接口IDrawAngle

,這樣代碼如下。”

public interface IDrawAngle {
   public void insert(String msg);
……
}

public class DrawAngle implements IDrawAngle {
public void DrawAngle() {
……
}
   public void insert(String msg){
     System.out.println("DrawAngle insert():"+msg);
}
……
}

public class DrawAdapter extends DrawCircle implements IDrawAngle {

private DrawAngle drawangle;
public DrawAdapter(DrawAngle angle) {
this.drawangle=angle;
}
public void insert(String msg) {
drawangle.insert(str);
}
……
}

“看到了麼,這樣我們就實現了類適配器(Adapter)模式。不過,類適配器(Adapter)有一個問題,如果我們的

Target和Adaptee有一個相同名字的方法,Adapter不能保證這兩個方法具有相同的含義或者行爲,這是非常危險

的。所以要注意這種情況!”

“哦,我知道了,Adapter模式的用處就在於使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。從

而解決我現在的問題。”
“美女不笨嘛。這頓你請,以後我請,嘿嘿……”
“想追我?這頓我請,以後嘛,呵呵,再說吧。謝謝,走吧。”“OK!”

欲知後事如何,請待下回。^_^

--------------------------------------------------------------------
Yakuu

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章