在現實生活中,常常需要對現有產品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟體開發過程中,有時想用一些現存的元件。這些元件可能只是完成了一些核心功能。但在不改變其結構的情況下,可以動態地擴充套件其功能。所有這些都可以釆用裝飾模式來實現。裝飾(decorator)模式的定義:指在不改變現有物件結構的情況下,動態地給該物件增加一些職責(即增加其額外功能)的模式,它屬於物件結構型模式。
其主要缺點是:裝飾模式增加了許多子類,如果過度使用會使程式變得很複雜。
星巴克咖啡訂單專案(咖啡館):
咖啡種類/單品咖啡:espresso(義大利濃咖啡)、shortblack、longblack(美式 咖啡)、decaf(無因咖啡)
調料:milk、soy(豆漿)、chocolate
要求在擴充套件新的咖啡種類時,具有良好的擴充套件性、改動方便、維護方便
使用oo的來計算不同種類咖啡的費用: 客戶可以點單品咖啡,也可以單品咖 啡+調料組合
首先抽象出乙個drink
類,它是乙個抽象構件(component)角色:定義乙個抽象介面以規範準備接收附加責任的物件
public abstract class drink
}
接下來就是乙個具體的構件角色了,
public class espresso extends coffee
}
public class longblack extends coffee
}
public class shortblack extends coffee
}
public class decaf extends coffee
}
以上是四個具體的構件角色。
現在要往咖啡中加調料:milk、soy(豆漿)、chocolate 等
我們也是通過抽象裝飾(decorator)角色:繼承抽象構件,幷包含具體構件的例項,可以通過其子類擴充套件具體構件的功能。
public class decorator extends drink
@override
public float cost()
@override
public string getdes()
}
抽象裝飾中聚合了drink obj,那後續在使用中,我們通過具體傳入espresso
、shortblack
等來裝配。
具體裝飾
public class milk extends decorator
}
public class soy extends decorator
}
//具體的decorator, 這裡就是調味品
public class chocolate extends decorator
}
public class coffeebar
}
測試結果:
費用1=5.0
描述= longblack
order 加入乙份牛奶 費用 =7.0
order 加入乙份牛奶 描述 = 牛奶 2.0 && longblack
order 加入乙份牛奶 加入乙份巧克力 費用 =10.0
order 加入乙份牛奶 加入乙份巧克力 描述 = 巧克力 3.0 && 牛奶 2.0 && longblack
order 加入乙份牛奶 加入2份巧克力 費用 =13.0
order 加入乙份牛奶 加入2份巧克力 描述 = 巧克力 3.0 && 巧克力 3.0 && 牛奶 2.0 && longblack
*************************==
order2 無因咖啡 費用 =1.0
order2 無因咖啡 描述 = 無因咖啡
order2 無因咖啡 加入乙份牛奶 費用 =3.0
order2 無因咖啡 加入乙份牛奶 描述 = 牛奶 2.0 && 無因咖啡
io流中的裝飾者設計模式
以inputstream為例,
inputstream
就是抽象構件(component)角色
filterinputstream
就是抽象裝飾角色(decorator),繼承並持有乙個inputstram的引用
剩下兩個角色自己對應,
裝飾者設計模式
裝飾者模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,decorator模式比生成子類更為靈活。讓decorator物件為自己新增功能。有時候使用concretecomponent的派生類提供核心功能,在這種情況就是用concretecomponent替代了component的功能,而且裝...
裝飾者設計模式
package 模式練習部分 首先建立,手機介面,然後建立最基本功能的手機,也就是只有接 功能的手機,然後在這個基礎上在設計乙個裝飾類 開始具體的裝飾過程,按照本例中的步驟,下面要做的就是對於具體裝飾者的建立,先有彩鈴,然後開始接 然後在接完 以後,沒有什麼其他的事情了,開始看會兒電視休息一下。建立...
裝飾者 設計模式
裝飾者 設計模式 1.增強乙個類的 功能,給某個類的 某個方法 增強了,重寫方法 2.讓裝飾類 互相裝飾 實現的步驟 1.在裝飾類的 內部 維護乙個 被裝飾類的 引用 最好是父類的引用 例如 bufferedline 內部維護的 是 bufferedreader類的引用 2.讓裝飾類 有乙個 共同的...