[Design Pattern] The Decorator Pattern
??? 作者:Flyingis
??? 按照常理,還是先闡述基本概念,Decorator Pattern可以用即時戰(zhàn)略游戲中兵種的裝甲強(qiáng)度來理解,舉一個典型的例子,魔獸爭霸(或冰峰王座等)中山丘是個非常厲害的角色了,經(jīng)常能夠一錘擊斃敵人的英雄和士兵,因此被譽(yù)為英雄殺手。既然是英雄殺手,時常需要沖鋒陷陣,在作戰(zhàn)過程中自然會面臨敵人的圍攻,此時我們有多種方式來提升山丘的抗擊打能力,一種是升級他的護(hù)甲,一種是通過魔法師給他施加增加防護(hù)的魔法,一種是等級到6時使用終極魔法來大幅度提高裝甲的防護(hù),還有一種就是使用無敵的魔法瓶,在規(guī)定時間內(nèi)誰都拿他沒轍,等等。雖然我不知道暴雪公司的工程師具體是如何實(shí)現(xiàn)這種功能設(shè)計的,但絕對不會是準(zhǔn)備多個具有不同防御等級的山丘對象來供程序調(diào)用,如Shanqiu1、Shanqiu2……ShanqiuN,這樣設(shè)計笨拙,代碼繁多,如果游戲中其他兵種的裝甲、攻擊力的設(shè)計都是如此,那即使是天才團(tuán)隊也會天天在上帝面前禱告的。
??? Decorator Pattern在這種情況下就可以發(fā)揮作用了,在普通裝甲升級時,使用普通的裝甲升級的裝飾器,在使用終極魔法時,使用終極魔法裝甲升級的裝飾器。
public?abstract?class?Soldier?{
??String?info?=?"Soldier's?name:";
??public?String?getInfo()?{
????return?info;
??}
??public?abstract?int?armor();
}

public?abstract?class?SoldierDecorator extends Soldier {
??public?abstract?String?getInfo();
}

public?class?NormalArmorUpdate?extends?SoldierDecorator?{
??Soldier?soldier;
??public?NormalArmorUpdate(Soldier?soldier)?{
????this.soldier?=?soldier;
??}

??public?String?getInfo()?{
????return?soldier.getInfo()?+?"Shanqiu?normal?update!";
??}

??public?int?armor()?{
????return?soldier.armor()?+?1;
??}
}

public?class?MagicArmorUpdate?extends?SoldierDecorator?{
??Soldier?soldier;
??public?MagicArmorUpdate(Soldier?soldier)?{
????this.soldier?=?soldier;
??}
??public?String?getInfo()?{
????return?soldier.getInfo()?+?"Shanqiu?magic?update!";
??}

??public?int?armor()?{
????return?soldier.armor()?+?5;
??}
}

public?class?Shanqiu?extend?Soldier?{
??public?int?armor()?{
????//?初始裝甲厚度
????return?3;
??}
}

public?class?PlayingGame?{
??public?static?void?main(String?args[])?{
????Soldier?soldier?=?new?Shanqiu();
????System.out.println("Initialized?armor:"?+?soldier.armor());

????//?普通裝甲升級
????soldier?=?new?NormalArmorUpdate(soldier);
????System.out.println("Initialized?armor:"?+?soldier.armor());

????//??使用終極魔法后裝甲升級
????soldier?=?new?MagicArmorUpdate(soldier);
????System.out.println("Initialized?armor:"?+?soldier.armor());
??}
}
??? 這樣就避免了建立多個Shanqiu類來描述他的不同狀態(tài),終極魔法時間過去后,還可以增加一個Decorator來減去相應(yīng)的裝甲厚度,給編程帶來了方便。
??? Decorator Pattern設(shè)計的目的,是為了能夠在運(yùn)行時而不是編譯期來動態(tài)改變對象的狀態(tài),使用組合的方式來增減Decorator,而不是去修改原有的代碼來滿足業(yè)務(wù)的需要,這樣利于程序的擴(kuò)展。當(dāng)然,在Java中使用接口同樣能夠輕便的實(shí)現(xiàn)文中描述的業(yè)務(wù)需要,但哪種更好,哪種更優(yōu)?
??? Java中的IO提供了大量Decorator Pattern設(shè)計的實(shí)例,在筆者很久的一篇隨筆中對此進(jìn)行了簡單介紹,建議還是看看JDK的幫助文檔。
??? 參考資料:《Head First Design Pattern》
??? 按照常理,還是先闡述基本概念,Decorator Pattern可以用即時戰(zhàn)略游戲中兵種的裝甲強(qiáng)度來理解,舉一個典型的例子,魔獸爭霸(或冰峰王座等)中山丘是個非常厲害的角色了,經(jīng)常能夠一錘擊斃敵人的英雄和士兵,因此被譽(yù)為英雄殺手。既然是英雄殺手,時常需要沖鋒陷陣,在作戰(zhàn)過程中自然會面臨敵人的圍攻,此時我們有多種方式來提升山丘的抗擊打能力,一種是升級他的護(hù)甲,一種是通過魔法師給他施加增加防護(hù)的魔法,一種是等級到6時使用終極魔法來大幅度提高裝甲的防護(hù),還有一種就是使用無敵的魔法瓶,在規(guī)定時間內(nèi)誰都拿他沒轍,等等。雖然我不知道暴雪公司的工程師具體是如何實(shí)現(xiàn)這種功能設(shè)計的,但絕對不會是準(zhǔn)備多個具有不同防御等級的山丘對象來供程序調(diào)用,如Shanqiu1、Shanqiu2……ShanqiuN,這樣設(shè)計笨拙,代碼繁多,如果游戲中其他兵種的裝甲、攻擊力的設(shè)計都是如此,那即使是天才團(tuán)隊也會天天在上帝面前禱告的。
??? Decorator Pattern在這種情況下就可以發(fā)揮作用了,在普通裝甲升級時,使用普通的裝甲升級的裝飾器,在使用終極魔法時,使用終極魔法裝甲升級的裝飾器。






























































??? 這樣就避免了建立多個Shanqiu類來描述他的不同狀態(tài),終極魔法時間過去后,還可以增加一個Decorator來減去相應(yīng)的裝甲厚度,給編程帶來了方便。
??? Decorator Pattern設(shè)計的目的,是為了能夠在運(yùn)行時而不是編譯期來動態(tài)改變對象的狀態(tài),使用組合的方式來增減Decorator,而不是去修改原有的代碼來滿足業(yè)務(wù)的需要,這樣利于程序的擴(kuò)展。當(dāng)然,在Java中使用接口同樣能夠輕便的實(shí)現(xiàn)文中描述的業(yè)務(wù)需要,但哪種更好,哪種更優(yōu)?
??? Java中的IO提供了大量Decorator Pattern設(shè)計的實(shí)例,在筆者很久的一篇隨筆中對此進(jìn)行了簡單介紹,建議還是看看JDK的幫助文檔。
??? 參考資料:《Head First Design Pattern》
posted on 2006-11-07 11:04 Flyingis 閱讀(3135) 評論(3) 編輯 收藏 所屬分類: 架構(gòu)與設(shè)計