本文是在學習中的總結,歡迎轉載但請注明出處:http://blog.csdn.net/pistolove/article/details/51531519
動態將職責添加到對象身上。若要擴大功能,裝潢者模式提供了比繼承更加靈活的替換方案。(摘自Head First 中文版第91頁)
通常情況下,在使用繼承設計子類的行動,是在編譯時靜態決定的,所有的子類都會繼承到相同的行動,這樣會產生耦合較高。而利用組合來擴大對象的行動,就能夠在運行時動態地進行擴大。裝潢者模式是組合的1種表現,但是裝潢者和被裝潢者要有相同的超類。
裝潢者模式是針對抽象組件(Component)進行編程。如果要針對具體組件進行編程,需要重新思考利用架構,斟酌裝潢者模式是不是適合。固然也能夠改變Component接口,增加新的對象行動,實現“半透明”的裝潢者模式,以便能夠在實際項目中做出最好選擇。
抽象構件角色(Component):給出1個抽象接口,以規范準備接收附加責任的對象。
具體構件角色(Concrete Component):定義將要接收附加責任的類。
裝潢角色(Decorator):持有1個構件(Component)對象的援用,并定義1個與抽象構件接口1致的接口。
具體裝潢角色(Concrete Decorator):負責給構件對象“貼上”附加的責任
抽象構件角色:Componet
package headfirst.design.decorator;
public interface Componet {
public void method();
}
具體構件角色(待裝潢者):ConcreateComponet
public class ConcreateComponet implements Componet {
@Override
public void method() {
System.err.println("I am a method");
}
}
裝潢角色:Decorator
package headfirst.design.decorator;
public class Decorator implements Componet{
private Componet componet;
public Decorator(Componet cp){
this.componet = cp;
}
@Override
public void method() {
componet.method();
}
}
具體裝潢角色:ConcreateDecotator
package headfirst.design.decorator;
public class ConcreateDecotator extends Decorator{
public ConcreateDecotator(Componet cp) {
super(cp);
}
public void method(){
//可在之前添加方法
addmethodbefore();
super.method();
//可在以后添加方法
addmethodafter();
}
private void addmethodafter() {
System.err.println("add method after");
}
private void addmethodbefore() {
System.err.println("add method before");
}
}
測試:Test
package headfirst.design.decorator;
public class Test {
public static void main(String[] args) {
Componet cp = new ConcreateComponet();
Decorator decorator = new ConcreateDecotator(cp);
decorator.method();
}
}
運行結果:
add method before
I am a method
add method after
適用性:需擴大1個類的功能,附加額外的職責。可以動態給對象添加功能,也能夠動態撤消。
優點:Decorator模式與繼承關系的目的都是要擴大對象的功能,但是Decorator可以提供比繼承更多的靈活性。通過使用不同的具體裝潢類和這些裝潢類的排列組合,設計師可以創造出很多不同行動的組合。
缺點:這類比繼承更加靈活機動的特性,也同時意味著更加多的復雜性。裝潢模式會致使設計中出現許多小類,如果過度使用,會使程序變得很復雜。
JDK源碼中也有很多地方用到了裝潢者模式。java io就是其中比較典型的范例。例如,InputStream–>FilterInputStream–>BufferedInputStream;其中FilterInputStream是裝潢角色,而BufferedInputStream等是具體的裝潢角色。
本文只是簡單介紹裝潢者模式,并未對其進行深入探討,略顯粗糙。希望本文對你有所幫助。
下一篇 對付短信發送攻擊