動態地給乙個物件增加一些額外的職責。就增加功能而言,decorator模式比生成子類更為靈活。
——《設計模式》gof
作用:在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。
比如,我們現在想設計乙個日誌類,記錄db日誌(或文字日誌),要求能夠對日誌的優先順序 和 錯誤級別進行記錄。
也就是對這個日誌類新增了記錄錯誤級別 和 優先順序的功能。後續還可能增加其他的功能。
publicinte***ce
log
publicclass databaselog implements
log
}
publicclass textfilelog implements
log
}
publicabstract
log
}
publicprivate
string errorlevel;
public
super
();
this.log =log;
}public
string geterrorlevel()
public
void
seterrorlevel(string errorlevel)
@override
public
void
write(string logcontent)
private
void
logerrorlevel(string errorlevel)
}
publicprivate
string priority;
public
super
();
this.log =log;
}public
string getpriority()
public
void
setpriority(string priority)
@override
public
void
write(string logcontent)
private
void
logpriority(string priority)
}
客戶端呼叫:
publicclass
client
}
輸出結果:
優先順序:特別優先
錯誤級別:1級錯誤
記錄db-log:hello world!
因此,如果現在需要加乙個功能,我們只需要新增乙個功能的裝飾子類就可以了,不需要新增其它的子類。它好就好在擁有執行時的靈活性,可以在需要用時隨意組合功能,而不需要靜態地把各種功能組合寫死在**中。裝飾模式 Decorator
裝飾模式 decorator 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。其中component定義了乙個物件介面,可以給這些物件動態的新增職責 concretecomponent是定義了乙個具體的物件,也可以給這個物件新增一些職責 decorator裝飾抽象類,...
Decorator 裝飾模式
定義 動態的給乙個物件新增一些輔助功能,而不改變原有的類。案例 假如現在有個文字控制項textview,它可以在螢幕上顯示文字,但當文字過多的時候,乙個螢幕顯示不下,這時就需要給它新增乙個滾動條。給乙個視窗加乙個滾動條不是原有的功能,而是額外的功能,比如還可以加乙個黑色外框,而且這些操作不是為某乙個...
裝飾模式 Decorator
裝飾模式 decorator 1.裝飾模式 decorator 的定義 又名包裝 模式,裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案。2.裝飾模式以對客戶端透明的方式動態的給乙個物件附加上更多的責任。換言之客戶端並不會覺的物件在裝飾前和裝飾後有什麼區別。3.裝飾模式可以在...