• <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)計

            最新評論

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

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

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

             

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

             

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

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

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

            來看看什么是裝飾器模式吧:

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

             


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

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



            基本符合了上面所提到的裝飾者模式的框架結(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();//用來描述吃蛋糕的感覺。。。。  
            14. }  

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

             

            再看看裝飾器的抽象類

            OtherDecorator

            Java代碼  收藏代碼
            1. package decorator.demo;  
            2.   
            3. /** 
            4.  * 其他用來添加蛋糕的東西 
            5.  * @author Nicholas 
            6.  * 
            7.  */  
            8. public abstract class OtherDecorator extends Cake{  
            9.     Cake cake;  
            10.     /** 
            11.      * 引用一個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ù)需要每個裝飾器都要有描述。 
            21.      */  
            22.     public abstract String getRemark();  
            23. }  
             

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

            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.      * 傳入一個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)。我們通過構(gòu)造方法傳入的cake實(shí)例。對cake進(jìn)行了裝飾,增加了新的功能。  
            25.         return cake.getImpression()+","+"看到一朵花真是happy";  
            26.     }  
            27.   
            28.     public String getRemark() {  
            29.         return cake.getRemark()+"+"+super.remark;  
            30.     }  
            31. }  

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

            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. }  
             

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


             

             

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

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


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


            久久国产综合精品五月天| 国产91久久精品一区二区| 久久这里只有精品视频99| 亚洲欧美久久久久9999| 久久夜色精品国产欧美乱| 久久国产精品99久久久久久老狼| 久久国产福利免费| 久久综合综合久久综合| 亚洲国产成人久久综合区| WWW婷婷AV久久久影片| 久久精品免费全国观看国产| AV狠狠色丁香婷婷综合久久| 2021最新久久久视精品爱| 久久亚洲国产欧洲精品一| 亚洲精品乱码久久久久久蜜桃不卡 | 久久精品无码一区二区三区日韩| 亚洲欧美国产日韩综合久久| 久久国产一区二区| 久久国产精品77777| 国产成人精品三上悠亚久久| 久久久WWW成人免费精品| 亚洲午夜久久久精品影院| 久久久久久国产精品免费无码 | 国产毛片欧美毛片久久久| 久久国产成人| 久久99精品久久久久久9蜜桃| 国产91色综合久久免费分享| 欧洲成人午夜精品无码区久久 | 久久精品国产久精国产思思| 久久久久av无码免费网| 一本色道久久88综合日韩精品 | 女人香蕉久久**毛片精品| 久久婷婷成人综合色综合| 午夜久久久久久禁播电影| 午夜天堂精品久久久久| 亚洲精品乱码久久久久久久久久久久| 久久综合九色综合网站| 天天躁日日躁狠狠久久| 久久99国产综合精品| 久久精品国产影库免费看| 嫩草影院久久99|