Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0

          導航

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          公告

          Flyingis博客空間內所有文章除特別聲明為[轉載],均為作者的學習心得和原創作品。如要轉載,請注明作者名flyingis及原文地址

          聯系方式

          常用鏈接

          留言簿(41)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          新聞檔案

          .Net 技術

          Ajax Technology

          Eclipse Technology

          ESRI Technology

          GIS Technology

          Java Technology

          Linux Technology

          Open Source

          個人博客

          精彩博客(技術類)

          精彩博客(非技術)

          搜索

          •  

          積分與排名

          • 積分 - 660690
          • 排名 - 72

          最新評論

          閱讀排行榜

          評論排行榜

          [Design Pattern] The Decorator Pattern

          ??? 作者:Flyingis

          ??? 按照常理,還是先闡述基本概念,Decorator Pattern可以用即時戰略游戲中兵種的裝甲強度來理解,舉一個典型的例子,魔獸爭霸(或冰峰王座等)中山丘是個非常厲害的角色了,經常能夠一錘擊斃敵人的英雄和士兵,因此被譽為英雄殺手。既然是英雄殺手,時常需要沖鋒陷陣,在作戰過程中自然會面臨敵人的圍攻,此時我們有多種方式來提升山丘的抗擊打能力,一種是升級他的護甲,一種是通過魔法師給他施加增加防護的魔法,一種是等級到6時使用終極魔法來大幅度提高裝甲的防護,還有一種就是使用無敵的魔法瓶,在規定時間內誰都拿他沒轍,等等。雖然我不知道暴雪公司的工程師具體是如何實現這種功能設計的,但絕對不會是準備多個具有不同防御等級的山丘對象來供程序調用,如Shanqiu1、Shanqiu2……ShanqiuN,這樣設計笨拙,代碼繁多,如果游戲中其他兵種的裝甲、攻擊力的設計都是如此,那即使是天才團隊也會天天在上帝面前禱告的。

          ??? Decorator Pattern在這種情況下就可以發揮作用了,在普通裝甲升級時,使用普通的裝甲升級的裝飾器,在使用終極魔法時,使用終極魔法裝甲升級的裝飾器。

          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類來描述他的不同狀態,終極魔法時間過去后,還可以增加一個Decorator來減去相應的裝甲厚度,給編程帶來了方便。

          ??? Decorator Pattern設計的目的,是為了能夠在運行時而不是編譯期來動態改變對象的狀態,使用組合的方式來增減Decorator,而不是去修改原有的代碼來滿足業務的需要,這樣利于程序的擴展。當然,在Java中使用接口同樣能夠輕便的實現文中描述的業務需要,但哪種更好,哪種更優?

          ??? Java中的IO提供了大量Decorator Pattern設計的實例,在筆者很久的一篇隨筆中對此進行了簡單介紹,建議還是看看JDK的幫助文檔。

          ??? 參考資料:《Head First Design Pattern》

          posted on 2006-11-07 11:04 Flyingis 閱讀(3132) 評論(3)  編輯  收藏 所屬分類: 架構與設計

          評論

          # re: [Design Pattern] Decorator Pattern  回復  更多評論   

          SoldierDecorator should extends Soldier
          2006-11-07 12:17 | jim[匿名]

          # re: [Design Pattern] Decorator Pattern  回復  更多評論   

          @jim[匿名]
          I'm sorry. It's a terrible mistake and it has been corrected.
          2006-11-07 14:48 | Flyingis

          # re: [Design Pattern] The Decorator Pattern  回復  更多評論   

          解釋得很好,很具體,不過抽象一點說,Decorator Pattern是為了動態擴展父類的方法
          2006-11-09 11:34 | itVincent
          主站蜘蛛池模板: 齐齐哈尔市| 莆田市| 南和县| 阿合奇县| 永兴县| 沂源县| 周至县| 饶阳县| 湖口县| 邻水| 台中县| 杭锦旗| 南靖县| 巴南区| 栾城县| 桐城市| 南丹县| 扶绥县| 临沭县| 株洲县| 遵义县| 繁昌县| 潞城市| 三原县| 菏泽市| 体育| 新和县| 临高县| 东兰县| 永清县| 雅安市| 河北省| 中方县| 乌恰县| 呼玛县| 定陶县| 社旗县| 威信县| 中卫市| 宜兰市| 静乐县|