裝飾者模式定義:動態的將新功能附加到對象上。在對象功能擴展方面,它比繼承更有彈性。
現實中,裝飾者模式就像一個快遞。我們購買的東西,需要經過一層一層的包裹,確保穩妥之後才被寄出。如果按照傳統的面向對象,每包裹一層就需要設計一個新類,這將會導致類爆炸。還有一個例子就是,我們所喝的咖啡,假設有N種調料,M中原始咖啡豆,它們組合成的咖啡無數種,很明顯,我們不可能爲每種可能都建立一個類。
這時候就會使用到裝飾者模式。
就如同JAVA裏面輸入輸出流。可以去參考api
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
所謂裝飾者模式就是,所有子類實現同一接口,且子類都擁有一個接口對象的字段。當一層層裝飾之後,調用最終的對象時,則會一層層遞歸執行相應的方法。(注意遞歸一詞)
代碼示例如下:
1
2
3
4
5
6
7
8
|
//劍接口 public abstract class SwordDecored
{ protected SwordDecored
swordDecored; public abstract String
hurt(); } |
1
2
3
4
5
6
7
|
public class DrinkBloodSword extends SwordDecored
{ @Override public String
hurt() { return "---飲血劍造成100點傷害" ; } } |
1
2
3
4
5
6
7
8
9
10
11
|
public class BlackFlameSword extends SwordDecored
{ public BlackFlameSword(SwordDecored
swordDecored) { super .swordDecored
= swordDecored; } @Override public String
hurt() { return "----黑火造成200點傷害" +swordDecored.hurt(); } } |
1
2
3
4
5
6
7
8
9
10
11
|
public class Main
{ public static void main(String[]
args) { DrinkBloodSword
drinkBloodSword = new DrinkBloodSword(); System.out.println( "獲得飲血劍,並攻擊" ); System.out.println(drinkBloodSword.hurt()); BlackFlameSword
blackFlameSword = new BlackFlameSword(drinkBloodSword); System.out.println( "給飲血劍鑲嵌黑炎劍氣石,並攻擊" ); System.out.println(blackFlameSword.hurt()); } } |