要給乙個類新增屬性或方法,除了直接在原始檔中新增這種簡陋的方法外,就是繼承某個類或者與將其與某個類關聯(作為內部屬性等)起來,但如果要動態的新增,這兩種方法都不合適,裝飾者模式,應運而生。
先說裝飾者模式的結構圖
最上層的介面,是抽象的被裝飾元件,裡面只有抽象的方法,緊跟其下的兩個類,左邊是具體的被裝飾元件,右邊是抽象的被裝飾者,最下層的兩個類,是具體的裝飾者,需要強調的是,裝飾者是不需要知道被裝飾者的存在的,也就是說,具體裝飾者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 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...