設計模式 070105 adapter模式

2021-04-12 16:00:20 字數 1894 閱讀 4789

filed under:

design & pattern — bruce zhang @ 4:59 pm

《讓僵冷的翅膀飛起來》系列之二

那麼怎樣為rm,mpeg類提供imedia介面所不具備的resize()方法呢?非常自然地,通過這個問題我們就引出adapter模式的命題了。首先,要假設乙個情況,就是原文的所有**,我們是無法改變的,這包括暴露的介面,類與介面的關係等等,都無法通過編碼的方式實現新的目標。只有這樣,引入adapter模式才有意義。

熟悉adapter模式的人都知道,adapter模式分為兩種:類的adapter模式、物件的adapter模式。下面我試圖根據本例對兩種方式進行說明及實現。在實現adapter模式之前,有必要看看原來的類結構:

下面我們就根據adapter模式來實現需求。

一、類的adapter模式

既然要讓rm、mpeg具有resize()方法,最好的辦法就是讓它們直接實現ivedioscreen介面。然而受到條件的限制,這兩個類型別是不可修改的。唯一可行的辦法就是為相應的類新引入乙個類型別,這就是adapter模式中所謂的adapter類了。它好比是乙個轉接頭,通過它去實現ivedioscreen介面,同時又令其繼承原有的rm或mpeg類,以保留原有的行為。類圖如下:

圖中的類rmadapter和mpegadapter就是通過adapter模式獲得的物件,它在保留了原有行為的同時,又擁有了ivedioscreen的功能。

**如下:

public inte***ce ivedioscreen

public class rmadapter:rm,ivedioscreen

}public class mpegadapter:mpeg,ivedioscreen

}oop中很重要的思想是,盡量使用聚合而非繼承。讓我們換一種思路來考察adapter模式。

二、物件的adapter模式

物件的adapter模式,與類的adapter模式,最大的區別就是不採用繼承的方式,而是將要包裹的物件,以聚合的方式放到adapter中,然後用委託的方式呼叫其物件的方法,實現類圖如下:

比較兩種實現方式的類圖,可以得出兩個結論:

1、物件的adapter模式,減少了物件的個數;

2、耦合度更加鬆散;

**如下:

public inte***ce ivedioscreen

public class vedioadapter:ivedioscreen

public void play()

public void resize()

}以這種方式形成的vedioadapter,由於沒有和rm、mpeg直接發生關係,並通過在建構函式傳遞引數的方式,等待客戶端使用adapter時,才將具體的vediomedia物件傳遞給adapter,顯得耦合度更加鬆散,更加靈活。

我們來看客戶端呼叫時,兩者的區別:

1、類的adapter模式

public class client

}2、物件的adapter模式

public class client

}其實,對於物件的adapter模式,還可以做一些改進,就是用屬性或方法來取代建構函式傳遞被包裹物件的方式。**修改如下:

public class vedioadapter:ivedioscreen}……

}這樣,上面的客戶端呼叫就更簡單了:

public class client

}通過運用adapter模式,擴充套件了新的介面,而原有的型別並不需要做任何改變,這就是adapter模式的實質,也是為什麼取名為adapter的原因之所在了。同時,我們要注意的是,在運用adapter模式時,必須審時度勢,根據具體的情況,抉擇最優的方式,或者採用類的adapter模式,或者採用物件的adapter模式。決定權在與你,選單給你送上來了,看看自己的腰包,想想點什麼樣的菜吧。  

設計模式 Adapt

乙個形象的例子 adapter 在朋友聚會上碰到了乙個美女sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助於我的朋友kent了,他作為我和sarah之間的adapter,讓我和sarah可以相互交談了 也不知道他會不會耍我 介面卡 變壓器 模式 把乙個類的介面變換成客戶端所期待的另一...

介面卡模式(Adapt) 設計模式(六)

作用 將乙個類的介面轉換成客戶希望的另外乙個介面。adapt 模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。解析 adapt 模式其實就是把完成同樣的乙個功能但是介面不能相容的類橋接在一起使之可以在一起工作,這個模式使得復用舊的介面成為可能.實現 adapt 模式有兩種實現辦法,一種...

介面卡模式Adapt

例子 牆上的插座為三孔介面,但是很多家電都是雙孔標準,這個時候就需要乙個介面卡,讓雙孔的家電通過介面卡後也可以接入三孔介面的插座 兩種介面卡 物件介面卡 三孔插座 雙孔插座 使用雙孔插座的電視 物件介面卡 author wjm date 2020 6 16 17 10 public class tv...