亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式 裝飾者模式 帶你重回傳奇世界

2019-11-06 08:16:07
字體:
來源:轉載
供稿:網友

今天繼續設計模式之旅,給大家帶來裝飾者模式,國際慣例,先看定義。

裝飾者模式:若要擴展功能,裝飾者提供了比集成更有彈性的替代方案,動態地將責任附加到對象上。

先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個類添加一些輔助的功能,并且不希望改變這個類的代碼,這時候就是裝飾者模式大展雄威的時候了。這里還體現了一個原則:類應該對擴展開放,對修改關閉。

下面進入正題,今天在那看電影,忽然想起年輕時在游戲場上的血雨腥風啊,哈哈,下面以游戲為背景介紹裝飾者模式。玩過游戲的兄弟應該都知道,游戲里面每個角色有武器、鞋子、護腕、戒指、還有各種紅寶石、藍寶石、黃寶石等等。

下面需求開始:設計游戲的裝備系統,基本要求,要可以計算出每種裝備在鑲嵌了各種寶石后的攻擊力和描述:

具體需求:

1、武器(攻擊力20) 、戒指(攻擊力5)、護腕(攻擊力5)、鞋子(攻擊力5)

2、藍寶石(攻擊力5/顆)、黃寶石(攻擊力10/顆)、紅寶石(攻擊力15/顆)

3、每個裝備可以隨意鑲嵌3顆

好了,需求介紹完畢,當然了,不要吐槽我的設計,尼瑪鞋子哪來的攻擊力,關鍵時刻也是可以砸人的嘛。下面開始初步的設想,出于多年面向對象的經驗,我們可能會這么設計:

如果你這么設計了,我靠,就這么點需求你寫了幾百個類,隨便添加兩個寶石,哈哈,指數增長聽過么,準備加班吧。

可能你還會這么設計:寫一個超類,然后里面各種set寶石,然后在計算攻擊力的地方,使勁的If有哪幾種寶石,恭喜你,代碼量不是很大,但是隨便添加個武器,你得又多寫多少個IF呢。

上面敘述了一些可能性的設計,都不是很好,下面看看如何將裝飾者模式融入:

首先是裝備的超類

package com.zhy.pattern.decorator;    /**  * 裝備的接口  *   * @author zhy  *   */  public interface IEquip  {        /**      * 計算攻擊力      *       * @return      */      public int caculateAttack();        /**      * 裝備的描述      *       * @return      */      public String description();  }  然后分別是武器、戒指、護腕、鞋子

package com.zhy.pattern.decorator;    /**  * 武器  * 攻擊力20  * @author zhy  *   */  public class ArmEquip implements IEquip  {        @Override      public int caculateAttack()      {          return 20;      }        @Override      public String description()      {          return "屠龍刀";      }    }  

package com.zhy.pattern.decorator;    /**  * 戒指  * 攻擊力 5  * @author zhy  *  */  public class RingEquip implements IEquip  {        @Override      public int caculateAttack()      {          return 5;      }        @Override      public String description()      {          return "圣戰戒指";      }    }  
package com.zhy.pattern.decorator;    /**  * 護腕  * 攻擊力 5  * @author zhy  *  */  public class WristEquip implements IEquip  {        @Override      public int caculateAttack()      {          return 5;      }        @Override      public String description()      {          return "圣戰護腕";      }    }  
package com.zhy.pattern.decorator;    /**  * 鞋子  * 攻擊力 5  * @author zhy  *   */  public class ShoeEquip implements IEquip  {        @Override      public int caculateAttack()      {          return 5;      }        @Override      public String description()      {          return "圣戰靴子";      }    }  

接下來當然是裝飾品,寶石了,首先超類

package com.zhy.pattern.decorator;    /**  * 裝飾品的接口  * @author zhy  *  */  public interface IEquipDecorator extends IEquip  {        }  下來藍寶石、黃寶石、紅寶石
package com.zhy.pattern.decorator;    /**  * 藍寶石裝飾品  * 每顆攻擊力+5  * @author zhy  *   */  public class BlueGemDecorator implements IEquipDecorator  {      /**      * 每個裝飾品維護一個裝備      */      PRivate IEquip equip;        public BlueGemDecorator(IEquip equip)      {          this.equip = equip;      }        @Override      public int caculateAttack()      {          return 5 + equip.caculateAttack();      }        @Override      public String description()      {          return equip.description() + "+ 藍寶石";      }    }  

package com.zhy.pattern.decorator;    /**  * 黃寶石裝飾品  * 每顆攻擊力+10  * @author zhy  *   */  public class YellowGemDecorator implements IEquipDecorator  {      /**      * 每個裝飾品維護一個裝備      */      private IEquip equip;        public YellowGemDecorator(IEquip equip)      {          this.equip = equip;      }        @Override      public int caculateAttack()      {          return 10 + equip.caculateAttack();      }        @Override      public String description()      {          return equip.description() + "+ 黃寶石";      }    }  
package com.zhy.pattern.decorator;    /**  * 紅寶石裝飾品 每顆攻擊力+15  *   * @author zhy  *   */  public class RedGemDecorator implements IEquipDecorator  {      /**      * 每個裝飾品維護一個裝備      */      private IEquip equip;        public RedGemDecorator(IEquip equip)      {          this.equip = equip;      }        @Override      public int caculateAttack()      {          return 15 + equip.caculateAttack();      }        @Override      public String description()      {          return equip.description() + "+ 紅寶石";      }    }  好了,到此結束,我們已經實現了需求的功能了,是不是每個類都很清晰加簡單,下面看測試:

package com.zhy.pattern.decorator;    public class Test  {      public static void main(String[] args)      {          // 一個鑲嵌2顆紅寶石,1顆藍寶石的靴子          System.out.println(" 一個鑲嵌2顆紅寶石,1顆藍寶石的靴子");          IEquip equip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip())));          System.out.println("攻擊力  : " + equip.caculateAttack());          System.out.println("描述 :" + equip.description());          System.out.println("-------");          // 一個鑲嵌1顆紅寶石,1顆藍寶石的武器          System.out.println(" 一個鑲嵌1顆紅寶石,1顆藍寶石,1顆黃寶石的武器");          equip = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new ArmEquip())));          System.out.println("攻擊力  : " + equip.caculateAttack());          System.out.println("描述 :" + equip.description());          System.out.println("-------");      }  }  輸出:

一個鑲嵌2顆紅寶石,1顆藍寶石的靴子  攻擊力  : 40  描述 :圣戰靴子+ 藍寶石+ 紅寶石+ 紅寶石  -------   一個鑲嵌1顆紅寶石,1顆藍寶石,1顆黃寶石的武器  攻擊力  : 50  描述 :屠龍刀+ 黃寶石+ 藍寶石+ 紅寶石  -------  

贊不贊,要是需求隨便多幾個裝備,幾種寶石,我們隨隨便便就可以加上,然后開開心心下班。

好了,恭喜你,你又學會了一個設計模式,裝飾者模式。

現在根據例子對定義的理解,不用我多說吧。

java的API中也有裝飾者模式的身影,如果你初學Java,一定記得Java里面的各種流,很痛苦吧,但是當你明

白你們的設計之后就會感覺清晰很多

把InputStream看作我們的IEquip,把FilterInputStream看作我們的IEquipDecorator,是不是和我們的設計幾乎一樣~

好了,就到這里,編程也是很有樂趣的么~是吧,各位看官留個言、給個贊唄~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲黄页网在线观看| 亚洲欧洲偷拍精品| 最近日韩中文字幕中文| 久久99青青精品免费观看| 亚洲电影免费观看高清完整版| 国产成人福利夜色影视| 日韩av在线免费看| 91国语精品自产拍在线观看性色| 国产精品老女人精品视频| 亚洲第一网站男人都懂| 国模精品一区二区三区色天香| 91经典在线视频| 亚洲精品suv精品一区二区| 欧美日韩国产一中文字不卡| 久久成人这里只有精品| 久久国产加勒比精品无码| 成人国产精品久久久久久亚洲| 亚洲色图日韩av| 欧美一级bbbbb性bbbb喷潮片| 日韩美女视频在线观看| 国产91色在线|免| 日韩电影中文字幕在线观看| 日韩av影视综合网| xxav国产精品美女主播| 色综合久久精品亚洲国产| 国产精品欧美久久久| 精品国产电影一区| 久久天堂av综合合色| 亚洲久久久久久久久久| 色婷婷**av毛片一区| 久久91精品国产| 久久精品国产99国产精品澳门| 狠狠干狠狠久久| 91国内免费在线视频| 亚洲欧美国产一区二区三区| 国产精品成人免费电影| 亚洲欧美一区二区三区情侣bbw| 欧美精品在线观看| 亚洲免费视频在线观看| 久久久精品日本| 在线看日韩欧美| 成人欧美一区二区三区黑人| 欧美大片第1页| 亚洲成**性毛茸茸| 亚洲欧洲自拍偷拍| 日韩成人av一区| 日韩av影片在线观看| 日日狠狠久久偷偷四色综合免费| 欧美日韩人人澡狠狠躁视频| 亚洲欧美成人网| 奇米成人av国产一区二区三区| 国产精品中文在线| 国产自摸综合网| 亚洲免费视频在线观看| 91国语精品自产拍在线观看性色| 日韩欧美国产网站| 欧美亚洲国产日本| 亚洲一区亚洲二区亚洲三区| 日本久久中文字幕| 91中文精品字幕在线视频| 色七七影院综合| 精品呦交小u女在线| 国产精自产拍久久久久久| 日韩高清电影免费观看完整版| 午夜精品一区二区三区在线| 亚洲国产精品视频在线观看| 一区二区三区亚洲| 欧美激情免费视频| 久久久久久久久久国产精品| 亚洲精品自产拍| 亚洲精品成人久久| 亚洲精品久久久久国产| 午夜精品久久久久久久99热| 欧美激情亚洲自拍| 亚洲人成电影网站色| 欧美激情第6页| 午夜精品久久久99热福利| 成人xvideos免费视频| 国产亚洲日本欧美韩国| 国产精品狼人色视频一区| 亚洲男人天堂九九视频| 日韩电影免费在线观看中文字幕| 欧美午夜电影在线| 国产偷国产偷亚洲清高网站| 国产精品旅馆在线| 热re99久久精品国产66热| 精品欧美一区二区三区| 91日韩在线播放| 欧美色视频日本版| 亚州成人av在线| 日韩中文在线视频| 尤物yw午夜国产精品视频明星| 97超级碰碰碰久久久| 久久伊人91精品综合网站| 91精品视频在线播放| 亚洲精品久久7777777| 国产不卡一区二区在线播放| 亚洲va欧美va在线观看| 久久久久久久久久久亚洲| 91在线高清视频| 美女久久久久久久| 国产精品福利无圣光在线一区| 欧美大片第1页| 在线观看日韩av| 中国人与牲禽动交精品| 国产欧美精品在线播放| 欧美日韩国产一区中文午夜| 亚洲欧美综合精品久久成人| 日韩精品免费在线观看| 日韩精品视频中文在线观看| 性色av一区二区咪爱| 北条麻妃一区二区三区中文字幕| 久久久精品影院| 国产综合久久久久| 欧美午夜性色大片在线观看| 国产区亚洲区欧美区| 懂色av中文一区二区三区天美| 亚洲国产精久久久久久久| 北条麻妃久久精品| 欧美专区日韩视频| 91精品国产91久久久久久久久| 午夜精品久久久久久久99黑人| 亚洲第五色综合网| 国产精品亚洲视频在线观看| 97精品国产97久久久久久春色| 日韩电影中文字幕av| 欧美高跟鞋交xxxxxhd| 成人精品福利视频| 最新中文字幕亚洲| 欧美老妇交乱视频| 日韩欧美在线观看视频| 91嫩草在线视频| 中文.日本.精品| 国产日韩欧美黄色| 日韩欧美一区二区三区| 综合网中文字幕| 亚洲伊人久久大香线蕉av| 日韩欧美999| 国产精品视频自拍| 日韩国产在线看| 欧美综合第一页| 亚洲二区在线播放视频| 国产精品99久久99久久久二8| 最近2019中文字幕第三页视频| 国产成人在线精品| 98视频在线噜噜噜国产| 欧美精品久久久久久久免费观看| 91精品国产高清久久久久久| 国产午夜精品理论片a级探花| 亚洲一级黄色av| 欧美一二三视频| 日本一欧美一欧美一亚洲视频| 亚洲激情国产精品| 亚洲va久久久噜噜噜| 久久久久久久久综合| 国产精品 欧美在线| 最近2019中文字幕mv免费看| 亚洲欧洲激情在线| 亚洲少妇激情视频| 欧美日韩国产va另类| 一区二区欧美亚洲| 久久久久久12| 大量国产精品视频| 美女撒尿一区二区三区|