小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

裝飾者模式一染色饅頭

 WindySky 2018-02-25

一模式定義

        裝飾者模式,是在不改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)擴(kuò)展一個(gè)對(duì)象功能,它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裝真實(shí)的對(duì)象。

  • 裝飾對(duì)象和真實(shí)對(duì)象有相同接口,這樣客戶端對(duì)象就可以和真實(shí)對(duì)象相同方式和裝飾對(duì)象交互。
  • 裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用。

二模式舉例

1模式分析

我們借用黑心商販制做染色饅頭案例說(shuō)明這一模式。



2裝飾者模式靜態(tài)類圖



3代碼示例

3.1創(chuàng)建饅頭接口——IBread

Java代碼  收藏代碼
  1. package com.demo.abs;  
  2.   
  3. /** 
  4.  * 饅頭加工接口 
  5.  *  
  6.  * @author 
  7.  *  
  8.  */  
  9. public interface IBread {  
  10.     // 準(zhǔn)備材料  
  11.     public void prepair();  
  12.   
  13.     // 和面  
  14.     public void kneadFlour();  
  15.   
  16.     // 蒸饅頭  
  17.     public void steamed();  
  18.   
  19.     /** 
  20.      * 加工饅頭方法 
  21.      */  
  22.     public void process();  
  23. }  

3.2正常饅頭實(shí)現(xiàn)——NormalBread

Java代碼  收藏代碼
  1. package com.demo.abs;  
  2.   
  3. /** 
  4.  * 正常饅頭的實(shí)現(xiàn) 
  5.  *  
  6.  * @author 
  7.  *  
  8.  */  
  9. public class NormalBread implements IBread {  
  10.     // 準(zhǔn)備材料  
  11.     public void prepair() {  
  12.         System.out.println("準(zhǔn)備面粉、水以及發(fā)酵粉...");  
  13.     }  
  14.   
  15.     // 和面  
  16.     public void kneadFlour() {  
  17.         System.out.println("和面...");  
  18.     }  
  19.   
  20.     // 蒸饅頭  
  21.     public void steamed() {  
  22.         System.out.println("蒸饅頭...香噴噴的饅頭出爐了!");  
  23.     }  
  24.   
  25.     /** 
  26.      * 加工饅頭方法 
  27.      */  
  28.     public void process() {  
  29.         // 準(zhǔn)備材料  
  30.         prepair();  
  31.         // 和面  
  32.         kneadFlour();  
  33.         // 蒸饅頭  
  34.         steamed();  
  35.     }  
  36.   
  37. }  

3.3創(chuàng)建抽象裝飾者——AbstractBread

Java代碼  收藏代碼
  1. package com.demo.decorator;  
  2.   
  3. import com.demo.abs.IBread;  
  4.   
  5. /** 
  6.  * 抽象裝飾者 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public abstract class AbstractBread implements IBread {  
  12.     // 存儲(chǔ)傳入的IBread對(duì)象  
  13.     private final IBread bread;  
  14.   
  15.     public AbstractBread(IBread bread) {  
  16.         this.bread = bread;  
  17.     }  
  18.   
  19.     // 準(zhǔn)備材料  
  20.     public void prepair() {  
  21.         this.bread.prepair();  
  22.     }  
  23.   
  24.     // 和面  
  25.     public void kneadFlour() {  
  26.         this.bread.kneadFlour();  
  27.     }  
  28.   
  29.     // 蒸饅頭  
  30.     public void steamed() {  
  31.         this.bread.steamed();  
  32.     }  
  33.   
  34.     // 加工饅頭方法  
  35.     public void process() {  
  36.         prepair();  
  37.         kneadFlour();  
  38.         steamed();  
  39.   
  40.     }  
  41. }  

3.4創(chuàng)建染色劑裝飾者——CornDecorator

Java代碼  收藏代碼
  1. package com.demo.decorator;  
  2.   
  3. import com.demo.abs.IBread;  
  4.   
  5. /** 
  6.  * 染色的玉米饅頭 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public class CornDecorator extends AbstractBread {  
  12.   
  13.     // 構(gòu)造方法  
  14.     public CornDecorator(IBread bread) {  
  15.         super(bread);  
  16.     }  
  17.   
  18.     // 黑心商販 開(kāi)始染色了  
  19.     public void paint() {  
  20.         System.out.println("添加檸檬黃的著色劑...");  
  21.     }  
  22.   
  23.     // 重載父類的和面方法  
  24.     @Override  
  25.     public void kneadFlour() {  
  26.         // 在面粉中加入 染色劑 之后才開(kāi)始和面  
  27.         this.paint();  
  28.         // 和面  
  29.         super.kneadFlour();  
  30.     }  
  31. }  

3.5創(chuàng)建甜蜜素裝飾者——SweetDecorator

Java代碼  收藏代碼
  1. package com.demo.decorator;  
  2.   
  3. import com.demo.abs.IBread;  
  4.   
  5. /** 
  6.  * 甜蜜素饅頭 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public class SweetDecorator extends AbstractBread {  
  12.     // 構(gòu)造方法  
  13.     public SweetDecorator(IBread bread) {  
  14.         super(bread);  
  15.     }  
  16.   
  17.     // 黑心商販 開(kāi)始添加甜蜜素  
  18.     public void paint() {  
  19.         System.out.println("添加甜蜜素...");  
  20.     }  
  21.   
  22.     // 重載父類的和面方法  
  23.     @Override  
  24.     public void kneadFlour() {  
  25.         // 在面粉中加入 甜蜜素 之后才開(kāi)始和面  
  26.         this.paint();  
  27.         // 和面  
  28.         super.kneadFlour();  
  29.     }  
  30. }  

3.6生產(chǎn)甜玉米饅頭——Client

Java代碼  收藏代碼
  1. package com.demo;  
  2.   
  3. import com.demo.abs.IBread;  
  4. import com.demo.abs.NormalBread;  
  5. import com.demo.decorator.CornDecorator;  
  6. import com.demo.decorator.SweetDecorator;  
  7.   
  8. /** 
  9.  * 客戶端應(yīng)用程序 
  10.  *  
  11.  * @author 
  12.  *  
  13.  */  
  14. public class Client {  
  15.   
  16.     /** 
  17.      * @param args 
  18.      */  
  19.     public static void main(String[] args) {  
  20.         // 生產(chǎn)裝飾饅頭  
  21.         System.out.println("\n====開(kāi)始裝飾饅頭?。?!");  
  22.         // 創(chuàng)建普通的正常饅頭實(shí)例  
  23.         // 這是我們需要包裝(裝飾)的對(duì)象實(shí)例  
  24.         IBread normalBread = new NormalBread();  
  25.   
  26.         // 下面就開(kāi)始 對(duì)正常饅頭進(jìn)行裝飾了?。。?nbsp; 
  27.         // 使用甜蜜素裝飾饅頭  
  28.         normalBread = new SweetDecorator(normalBread);  
  29.         // 使用檸檬黃的著色劑裝飾饅頭  
  30.         normalBread = new CornDecorator(normalBread);  
  31.         // 生產(chǎn)饅頭信息  
  32.         normalBread.process();  
  33.         System.out.println("====裝飾饅頭結(jié)束?。。?);  
  34.   
  35.     }  
  36.   
  37. }  

4運(yùn)行結(jié)果

====開(kāi)始裝飾饅頭?。?!

準(zhǔn)備面粉、水以及發(fā)酵粉...

添加檸檬黃的著色劑...

添加甜蜜素...

和面...

蒸饅頭...香噴噴的饅頭出爐了!

====裝飾饅頭結(jié)束!?。?/span>

 

三該模式設(shè)計(jì)原則

1 封閉變化部分

2 “開(kāi)一閉"原則

3 面向抽象編程

4 優(yōu)先使用組合,而非繼承

 

四使用場(chǎng)合

1當(dāng)我們需要為某個(gè)現(xiàn)有對(duì)象動(dòng)態(tài)增加一個(gè)新功能或職責(zé)時(shí),可以考慮使用裝飾者模式。

2當(dāng)某個(gè)對(duì)象的職責(zé)經(jīng)常發(fā)生變化或經(jīng)常需要?jiǎng)討B(tài)增加職責(zé),避免為了適應(yīng)這樣的變化而增加繼承子類擴(kuò)展的方式,因?yàn)檫@種方式會(huì)造成子類膨脹速度過(guò)快,難以控制,此時(shí)可以使用裝飾者模式。

 

五裝飾者模式靜態(tài)類圖



 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多