2013-03-11 58 views
3

我已閱讀,裝飾適配器更透明的客戶端,這是該透明度這使得嵌​​套的裝飾成爲可能。在這種情況下,透明度究竟意味着什麼?裝飾器比適配器更透明是什麼意思?

P.S:我知道這些設計模式。所以你可以基於你的答案在這個前提下。

回答

5

裝飾器接受給定類型A的對象,並將其包裝到相同類型A的對象中。客戶端可以使用裝飾對象,因爲它們具有相同類型,因爲它使用實際對象。

的適配器採用給定類型A的對象,並將其包裝成另一種類型B.其中所用的原始型A A客戶端然後必須適於使用其他類型B.

的目的即說,如果我們使用適配器模式,正是因爲客戶需要一個B類型的對象,而我們只有一個A類型的對象。所以我們把它包裝到一個適配器中,使它成爲B類型的一個對象。

這兩種模式使用相同的原理(包裝),但用於不同的目的。修飾器來改變原始對象的行爲。一個適配器來改變它的類型。

+0

透明度部分呢? – Geek 2013-03-11 19:49:02

+1

這就是我在第一部分中解釋的:客戶端使用裝飾器的方式與使用裝飾對象的方式相同,因爲它們具有相同的類型。它對客戶是透明的。您可以像寫入FileOutputStream一樣將字節寫入BufferedOutputStream,因爲它們都是OutputStream。 – 2013-03-11 19:50:57

3

使用裝飾器和裝飾對象(都具有相同的接口)之間的客戶端沒有區別。因此裝飾器是透明的(即客戶端不可見)。裝飾者也可以被其他裝飾者裝飾 - 這不會影響客戶端。客戶端仍然可以認爲他正在裝飾對象。

尼斯樣品是Streams。你可以傳遞任何數量的裝飾器(壓縮,加密,緩衝)裝飾的流,但這些裝飾器將保持不可見的任何客戶端使用流。

其實我不明白爲什麼適配器可以被認爲是透明的。客戶端不應該知道適配器的類型,並且客戶端不能將適配器視爲適配器,因爲它們具有不同的接口。

0

回答裝飾者是如何透明的,比爲什麼適配器是偷偷摸摸或混亂的。裝飾者往往更容易嵌套到大規模功能(這通常是正交的,例如,BufferedFileWriter增加了緩衝,這並沒有真正改變其包裝類的基本操作:它將這些操作委託給原始的)。通常,您可以很容易地看到裝飾器正在做什麼,因爲它在自己的原始界面中隱藏自身。

適配器可以同樣透明。我猜想嵌套適配器更困難的原因是你正在談論改變一些狀態對象。然後你很快就會陷入所有的醜陋(這是在MVC中發生的事情之一)。舉例來說,我有一個老的應用程序,給了我一個輸入一堆風險評級。有一個新的Web界面想要使用它,但它需要另一種格式的數據。我們無法更改原始代碼,因此我們引入了可翻譯的適配器。什麼是翻譯?一般是一些狀態表示。因此,如果界面不同,它將採取輸入並轉換並重新調整它們,如果輸出需要進一步的按摩,那麼。如果您將多個適配器分層,那麼您很快就會發現自己很難弄清誰對提交的最終對象(服務或服務返回給用戶)做出了什麼貢獻。

修飾器通常不用於這種翻譯工作,而是用於補充我們要麼沒有代碼的東西的功能,要麼補充新功能正交的東西的功能,因此我們允許用戶可以使用或不使用一個或多個裝飾器。