• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            裝飾者模式 --- 轉(zhuǎn)

            MM們要過(guò)生日了 ,怎么也得表示下吧。最起碼先送個(gè)蛋糕。蛋糕多種多樣了。巧克力,冰淇淋,奶油等等。這都是基本的了 ,再加點(diǎn)額外的裝飾,如蛋糕里放點(diǎn)花。放賀卡。放點(diǎn)干果吃著更香等等。看看我是如何設(shè)計(jì)的。

                  我想既然是蛋糕,那我就把蛋糕作為一個(gè)抽象類,剩下的蛋糕子類型來(lái)繼承它,每個(gè)子類都有吃該蛋糕的感覺 ^_^,看起來(lái)真的不錯(cuò)。蛋糕的子類分別是奶酪蛋糕,巧克力蛋糕,冰淇淋蛋糕,插花的冰淇淋蛋糕,放賀卡的冰淇淋蛋糕。某個(gè)MM的生日蛋糕喜歡帶花的冰淇 淋蛋糕。還好我早有準(zhǔn)備。但是有幾次失策了。。她們要的蛋糕我這都沒有。比如帶鮮花的巧克力蛋糕。帶果仁的牛奶蛋糕。帶鮮花帶果仁的蛋糕。。。。那我還要 繼續(xù)添加蛋糕的子類。。問題出現(xiàn)了。這樣會(huì)造成大量的蛋糕子類 。真是噩夢(mèng)啊。

             

            那么我要好好思考這個(gè)問題了。發(fā)現(xiàn)了剛才的設(shè)計(jì)確實(shí)有問題。。發(fā)現(xiàn)了真正的要關(guān)注的主體是蛋糕。。而賀卡,花,果仁等等只不過(guò)是裝飾 的作用。

             

            思路來(lái)了。蛋糕作為主體,其他的東西都加到蛋糕上。MM要啥我就加啥唄。呵呵。

            到現(xiàn)在我們要明確的是:

            • 蛋糕是主體。
            • 花,賀卡,果仁等等是裝飾者。
            • 可以用裝飾者包裝蛋糕。

            來(lái)看看什么是裝飾器模式吧:

            動(dòng)態(tài)的將責(zé)任附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。

             


            • Component:抽象出的主體對(duì)象。
            • ConcreteComponent:是要?jiǎng)討B(tài)擴(kuò)展的對(duì)象,它繼承自Component.
            • Decorator:是裝飾器的接口。(這里的接口并不是指java的interface)。
            • ConcreteDecoratorA:實(shí)現(xiàn)Decorator的類,包含了一個(gè)Component引用,這樣就可以擴(kuò)展Component的方法了。

            說(shuō)完理論了。可能還一頭霧水吧。。。還是接著蛋糕的例子繼續(xù)說(shuō)。先看圖吧。



            基本符合了上面所提到的裝飾者模式的框架結(jié)構(gòu)了。再看看代碼:

            Cake

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2.   
            3. /** 
            4.  * 蛋糕基類 
            5.  * @author Nicholas 
            6.  * 
            7.  */  
            8. public abstract class Cake {  
            9.     String remark = "蛋糕";  
            10.     public String getRemark() {  
            11.         return remark;  
            12.     }  
            13.     public abstract String getImpression();//用來(lái)描述吃蛋糕的感覺。。。。  
            14. }  

             Cake是個(gè)抽象類,它已經(jīng)實(shí)現(xiàn)了getRemark的方法。但沒有實(shí)現(xiàn)getImpression.這個(gè)方法必須被子類實(shí)現(xiàn)。

             

            再看看裝飾器的抽象類

            OtherDecorator

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2.   
            3. /** 
            4.  * 其他用來(lái)添加蛋糕的東西 
            5.  * @author Nicholas 
            6.  * 
            7.  */  
            8. public abstract class OtherDecorator extends Cake{  
            9.     Cake cake;  
            10.     /** 
            11.      * 引用一個(gè)Cake. 
            12.      * 讓被裝飾者進(jìn)入裝飾者之中。這里用的是構(gòu)造方法注入。 
            13.      * 這樣就可以調(diào)用Cake實(shí)例的方法了。 
            14.      * @param cake 
            15.      */  
            16.     public OtherDecorator(Cake cake){  
            17.         this.cake=cake;  
            18.     }  
            19.     /** 
            20.      * 讓裝飾器的子類都去實(shí)現(xiàn)getRemark方法。業(yè)務(wù)需要每個(gè)裝飾器都要有描述。 
            21.      */  
            22.     public abstract String getRemark();  
            23. }  
             

            下面讓我們實(shí)現(xiàn)一個(gè)蛋糕吧。^_^。。

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2. /** 
            3.  * 乳酪蛋糕 
            4.  * @author Nicholas 
            5.  * 
            6.  */  
            7. public class CheeseCake extends Cake{  
            8.     /** 
            9.      * 乳酪蛋糕的構(gòu)造方法 
            10.      */  
            11.     public CheeseCake(){  
            12.         super.remark="乳酪蛋糕";//修改乳酪蛋糕的描述。  
            13.     }  
            14.   
            15.     /** 
            16.      * 實(shí)現(xiàn)了Cake抽象類的getImpression 
            17.      * 吃乳酪蛋糕的感覺。。 
            18.      */  
            19.     public String getImpression() {  
            20.         return "香甜感受";  
            21.     }  
            22.   
            23. }  
             

            其他實(shí)現(xiàn)Cake的類就不列出了,道理是一樣的。

            下面我們要開始實(shí)現(xiàn)具體的裝飾器了。

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2.   
            3. /** 
            4.  * 給蛋糕添加的花 
            5.  * @author Nicholas 
            6.  * 
            7.  */  
            8. public class FlowerDecorator extends OtherDecorator{  
            9.       
            10.     /** 
            11.      * 構(gòu)造函數(shù) 
            12.      * 傳入一個(gè)cake實(shí)例,也就是前面所實(shí)現(xiàn)的Cake的子類,如奶酪蛋糕,巧克力蛋糕等等。 
            13.      * @param cake 
            14.      */  
            15.     public FlowerDecorator(Cake cake){  
            16.         super(cake);//調(diào)用父類的構(gòu)造方法,可以獲取Cake的實(shí)例了。就可以調(diào)用Cake實(shí)例的方法.  
            17.         super.remark="一朵玫瑰花";  
            18.     }  
            19.       
            20.     /** 
            21.      * 實(shí)現(xiàn)了裝飾器抽象類的getImpression方法。 
            22.      */  
            23.     public String getImpression() {  
            24.         //這是重點(diǎn)。我們通過(guò)構(gòu)造方法傳入的cake實(shí)例。對(duì)cake進(jìn)行了裝飾,增加了新的功能。  
            25.         return cake.getImpression()+","+"看到一朵花真是happy";  
            26.     }  
            27.   
            28.     public String getRemark() {  
            29.         return cake.getRemark()+"+"+super.remark;  
            30.     }  
            31. }  

             到現(xiàn)在終于大功告成了。。這樣方便了很多,可以通過(guò)裝飾器生成很多種類的蛋糕。

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2.   
            3. public class MyGirlB {  
            4.     public static void main(String[] args){  
            5.         //用果仁,花包裝巧克力蛋糕。  
            6.         Cake nutsFlowerChocolateCake = new NutsDecorator(new FlowerDecorator(new ChocolateCake()));  
            7.         System.out.println("remark "+nutsFlowerChocolateCake.getRemark());  
            8.         //吃蛋糕的感受已經(jīng)發(fā)生了改變。  
            9.         System.out.println("impression "+nutsFlowerChocolateCake.getImpression());  
            10.     }  
            11. }  
             

            這個(gè)模式的缺點(diǎn)也挺明顯的 ,看看如下圖片


             

             

            為了擴(kuò)展cake的功能,加入了許多的裝飾類。。當(dāng)然用戶也可以繼承OtherDecorator來(lái)繼續(xù)擴(kuò)展。但是對(duì)API使用者是個(gè)困擾。。所以API要說(shuō)明哪些類是用來(lái)包裝的。。

            posted on 2013-09-05 19:22 大龍 閱讀(367) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲国产综合久久天堂| 久久免费大片| 久久青青草原精品国产不卡| 久久精品人人做人人妻人人玩| 欧美亚洲色综久久精品国产| 精品国产乱码久久久久久1区2区| 久久精品国产69国产精品亚洲| 国产精品久久久久乳精品爆| 亚洲精品国精品久久99热| 岛国搬运www久久| 国产成人无码精品久久久久免费 | 91精品无码久久久久久五月天| 国产精品狼人久久久久影院 | AV狠狠色丁香婷婷综合久久| 麻豆成人久久精品二区三区免费| 无码人妻精品一区二区三区久久久| 99久久精品费精品国产一区二区| 久久无码一区二区三区少妇| 欧美日韩成人精品久久久免费看 | 99久久精品费精品国产| 91精品观看91久久久久久| 国产激情久久久久影院小草 | 久久精品成人免费观看97| 久久夜色精品国产亚洲| 色综合久久最新中文字幕| 18岁日韩内射颜射午夜久久成人| 青青草国产成人久久91网| 热久久国产精品| 午夜精品久久久久久| 无码久久精品国产亚洲Av影片| 久久精品国产亚洲av麻豆色欲| 久久免费美女视频| 欧美日韩中文字幕久久久不卡 | 久久中文娱乐网| 久久无码一区二区三区少妇| 亚洲综合熟女久久久30p| 国产精品一久久香蕉产线看| 久久影院亚洲一区| 久久99精品久久久久久hb无码| 久久精品成人| 国产成人综合久久综合|