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

            大龍的博客

            常用鏈接

            統計

            最新評論

            裝飾者模式 --- 轉

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

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

             

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

             

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

            到現在我們要明確的是:

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

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

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

             


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

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



            基本符合了上面所提到的裝飾者模式的框架結構了。再看看代碼:

            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是個抽象類,它已經實現了getRemark的方法。但沒有實現getImpression.這個方法必須被子類實現。

             

            再看看裝飾器的抽象類

            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.      * 讓被裝飾者進入裝飾者之中。這里用的是構造方法注入。 
            13.      * 這樣就可以調用Cake實例的方法了。 
            14.      * @param cake 
            15.      */  
            16.     public OtherDecorator(Cake cake){  
            17.         this.cake=cake;  
            18.     }  
            19.     /** 
            20.      * 讓裝飾器的子類都去實現getRemark方法。業務需要每個裝飾器都要有描述。 
            21.      */  
            22.     public abstract String getRemark();  
            23. }  
             

            下面讓我們實現一個蛋糕吧。^_^。。

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

            其他實現Cake的類就不列出了,道理是一樣的。

            下面我們要開始實現具體的裝飾器了。

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

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

            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.         //吃蛋糕的感受已經發生了改變。  
            9.         System.out.println("impression "+nutsFlowerChocolateCake.getImpression());  
            10.     }  
            11. }  
             

            這個模式的缺點也挺明顯的 ,看看如下圖片


             

             

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

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

            大香伊人久久精品一区二区| 久久精品毛片免费观看| 久久久人妻精品无码一区| 亚洲国产成人久久精品99| 亚洲色欲久久久综合网东京热| 少妇久久久久久被弄高潮| 精品久久久久久中文字幕| 香蕉99久久国产综合精品宅男自 | 狠狠色丁香久久婷婷综合图片| 伊人久久亚洲综合影院| 人妻精品久久无码区| 国产成人久久精品麻豆一区| 18禁黄久久久AAA片| 一本大道加勒比久久综合| 中文字幕无码免费久久| 久久99精品久久久久久齐齐| 亚洲欧美日韩久久精品第一区| 国产精品综合久久第一页| 国产精品久久久久…| 伊人热热久久原色播放www| 2020最新久久久视精品爱| 久久人爽人人爽人人片AV | 伊人丁香狠狠色综合久久| 一级a性色生活片久久无| 亚洲综合久久综合激情久久| 丰满少妇高潮惨叫久久久| 午夜精品久久久久久99热| 亚洲欧美国产日韩综合久久 | 日日狠狠久久偷偷色综合免费| 久久本道伊人久久| 2022年国产精品久久久久| 久久AV无码精品人妻糸列| 久久天天婷婷五月俺也去| 久久久久综合国产欧美一区二区| 久久久综合九色合综国产| a高清免费毛片久久| 久久久久99精品成人片直播| 久久www免费人成看片| 精品国产99久久久久久麻豆| 伊人久久大香线蕉综合5g| 欧美精品丝袜久久久中文字幕 |