設計模式No 2 裝飾者模式

2021-06-29 16:47:44 字數 1492 閱讀 6597

要給乙個類新增屬性或方法,除了直接在原始檔中新增這種簡陋的方法外,就是繼承某個類或者與將其與某個類關聯(作為內部屬性等)起來,但如果要動態的新增,這兩種方法都不合適,裝飾者模式,應運而生。

先說裝飾者模式的結構圖

最上層的介面,是抽象的被裝飾元件,裡面只有抽象的方法,緊跟其下的兩個類,左邊是具體的被裝飾元件,右邊是抽象的被裝飾者,最下層的兩個類,是具體的裝飾者,需要強調的是,裝飾者是不需要知道被裝飾者的存在的,也就是說,具體裝飾者a、b和具體的被裝飾者之間,沒有任何的直接互動

這段話說的有點拗口,來乙個簡單的例項吧,假設我開了一家咖啡店,提供各種口味的咖啡,例如黑咖啡、卡布奇諾、拿鐵等,每種咖啡都可以加方糖、奶精等等,那我怎樣用**實現**計算,給每種咖啡定乙個**嗎,黑咖啡原版、黑咖啡加糖版、黑咖啡加奶版、卡布奇諾原版、卡布奇諾加糖版……這顯然不是乙個聰明的做法,實際情況是怎麼做的呢?黑咖啡、卡布奇諾、拿鐵各有各的價,方糖、奶精也各有各的價,黑咖啡加方糖,或是其他什麼組合,都只需要把兩者的**加起來就是了,這,就是裝飾者模式,下面是這個例子的**實現:

抽象的咖啡介面

public inte***ce coffee
具體的某種咖啡類(黑咖啡)

public class blackcoffee implements coffee 

@override

public string showtaste()

}

抽象的咖啡伴侶類(方糖、奶精的父類)

public class mate implements coffee

@override

public int showprice()

@override

public string showtaste()

}

具體的咖啡伴侶

public class milkdeco extends mate

@override

public int showprice()

@override

public string showtaste()

}

package decoratestyle2;

public class sugardeco extends mate

@override

public int showprice()

@override

public string showtaste()

}

測試類

public class test 

}

輸出結果:

黑咖啡+糖   11

黑咖啡+糖+牛奶   13

設計模式2 裝飾者模式(java IO)

設計類 開放 關閉原則 要對擴充套件開放,對修改關閉。多用組合,少用繼承。高內聚低耦合 具體原因 當我們設計的類不能滿足我們的需求的時候,我們可能設計乙個類去繼承它,但是這樣就會使物件之間高度的耦合。此時,我們就可以考慮使用裝飾者模式 把物件嵌入我們要擴充套件功能的類中,呼叫他的方法,然後跟我們定義...

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...