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