裝飾者模式(3)

裝飾者模式定義:動態的將新功能附加到對象上。在對象功能擴展方面,它比繼承更有彈性。


現實中,裝飾者模式就像一個快遞。我們購買的東西,需要經過一層一層的包裹,確保穩妥之後才被寄出。如果按照傳統的面向對象,每包裹一層就需要設計一個新類,這將會導致類爆炸。還有一個例子就是,我們所喝的咖啡,假設有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());
    }
}


發佈了56 篇原創文章 · 獲贊 14 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章