最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java基于裝飾者模式實現(xiàn)的染色饅頭案例詳解

 更新時間:2018年05月15日 14:28:25   作者:chengqiuming  
這篇文章主要介紹了Java基于裝飾者模式實現(xiàn)的染色饅頭案例,簡單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關實現(xiàn)步驟、操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了Java基于裝飾者模式實現(xiàn)的染色饅頭案例。分享給大家供大家參考,具體如下:

一、模式定義

裝飾者模式,是在不改變原類文件和使用繼承的情況下,動態(tài)擴展一個對象功能,它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裝真實的對象。

裝飾對象和真實對象有相同接口,這樣客戶端對象就可以和真實對象相同方式和裝飾對象交互。

裝飾對象包含一個真實對象的引用。

二、模式舉例

1. 模式分析

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

 

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

 

3. 代碼示例

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

package com.demo.abs;
/**
 * 饅頭加工接口
 *
 * @author
 *
 */
public interface IBread {
  // 準備材料
  public void prepair();
  // 和面
  public void kneadFlour();
  // 蒸饅頭
  public void steamed();
  /**
   * 加工饅頭方法
   */
  public void process();
}

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

package com.demo.abs;
/**
 * 正常饅頭的實現(xiàn)
 *
 * @author
 *
 */
public class NormalBread implements IBread {
  // 準備材料
  public void prepair() {
    System.out.println("準備面粉、水以及發(fā)酵粉...");
  }
  // 和面
  public void kneadFlour() {
    System.out.println("和面...");
  }
  // 蒸饅頭
  public void steamed() {
    System.out.println("蒸饅頭...香噴噴的饅頭出爐了!");
  }
  /**
   * 加工饅頭方法
   */
  public void process() {
    // 準備材料
    prepair();
    // 和面
    kneadFlour();
    // 蒸饅頭
    steamed();
  }
}

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

package com.demo.decorator;
import com.demo.abs.IBread;
/**
 * 抽象裝飾者
 *
 * @author
 *
 */
public abstract class AbstractBread implements IBread {
  // 存儲傳入的IBread對象
  private final IBread bread;
  public AbstractBread(IBread bread) {
    this.bread = bread;
  }
  // 準備材料
  public void prepair() {
    this.bread.prepair();
  }
  // 和面
  public void kneadFlour() {
    this.bread.kneadFlour();
  }
  // 蒸饅頭
  public void steamed() {
    this.bread.steamed();
  }
  // 加工饅頭方法
  public void process() {
    prepair();
    kneadFlour();
    steamed();
  }
}

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

package com.demo.decorator;
import com.demo.abs.IBread;
/**
 * 染色的玉米饅頭
 *
 * @author
 *
 */
public class CornDecorator extends AbstractBread {
  // 構造方法
  public CornDecorator(IBread bread) {
    super(bread);
  }
  // 黑心商販 開始染色了
  public void paint() {
    System.out.println("添加檸檬黃的著色劑...");
  }
  // 重載父類的和面方法
  @Override
  public void kneadFlour() {
    // 在面粉中加入 染色劑 之后才開始和面
    this.paint();
    // 和面
    super.kneadFlour();
  }
}

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

package com.demo.decorator;
import com.demo.abs.IBread;
/**
 * 甜蜜素饅頭
 *
 * @author
 *
 */
public class SweetDecorator extends AbstractBread {
  // 構造方法
  public SweetDecorator(IBread bread) {
    super(bread);
  }
  // 黑心商販 開始添加甜蜜素
  public void paint() {
    System.out.println("添加甜蜜素...");
  }
  // 重載父類的和面方法
  @Override
  public void kneadFlour() {
    // 在面粉中加入 甜蜜素 之后才開始和面
    this.paint();
    // 和面
    super.kneadFlour();
  }
}

3.6 生產甜玉米饅頭——Client

package com.demo;
import com.demo.abs.IBread;
import com.demo.abs.NormalBread;
import com.demo.decorator.CornDecorator;
import com.demo.decorator.SweetDecorator;
/**
 * 客戶端應用程序
 *
 * @author
 *
 */
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 生產裝飾饅頭
    System.out.println("\n====開始裝飾饅頭?。。?);
    // 創(chuàng)建普通的正常饅頭實例
    // 這是我們需要包裝(裝飾)的對象實例
    IBread normalBread = new NormalBread();
    // 下面就開始 對正常饅頭進行裝飾了?。?!
    // 使用甜蜜素裝飾饅頭
    normalBread = new SweetDecorator(normalBread);
    // 使用檸檬黃的著色劑裝飾饅頭
    normalBread = new CornDecorator(normalBread);
    // 生產饅頭信息
    normalBread.process();
    System.out.println("====裝飾饅頭結束?。?!");
  }
}

4. 運行結果

====開始裝飾饅頭?。?!
準備面粉、水以及發(fā)酵粉...
添加檸檬黃的著色劑...
添加甜蜜素...
和面...
蒸饅頭...香噴噴的饅頭出爐了!
====裝飾饅頭結束?。?!

三、該模式設計原則

1 封閉變化部分
2 “開一閉"原則
3 面向抽象編程
4 優(yōu)先使用組合,而非繼承

四、使用場合

1. 當我們需要為某個現(xiàn)有對象動態(tài)增加一個新功能或職責時,可以考慮使用裝飾者模式。

2. 當某個對象的職責經常發(fā)生變化或經常需要動態(tài)增加職責,避免為了適應這樣的變化而增加繼承子類擴展的方式,因為這種方式會造成子類膨脹速度過快,難以控制,此時可以使用裝飾者模式。

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

 

更多關于java算法相關內容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • SWT(JFace) Wizard(Eclipse插件編程必備)

    SWT(JFace) Wizard(Eclipse插件編程必備)

    SWT(JFace)小制作:Wizard(Eclipse插件編程必備)
    2009-06-06
  • Java設計模式中裝飾者模式應用詳解

    Java設計模式中裝飾者模式應用詳解

    裝飾者模式:在不改變原有對象的基礎之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細講解一下裝飾者模式,需要的可以參考一下
    2022-11-11
  • Java?Float?保留小數(shù)位精度的實現(xiàn)

    Java?Float?保留小數(shù)位精度的實現(xiàn)

    這篇文章主要介紹了Java?Float?保留小數(shù)位精度的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java8新特性之類型注解_動力節(jié)點Java學院整理

    Java8新特性之類型注解_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java8新特性之類型注解的相關資料,需要的朋友可以參考下
    2017-06-06
  • springboot引入druid解析sql的過程

    springboot引入druid解析sql的過程

    在開發(fā)中,有時我們可能會需要獲取SQL中的表名,那么因為不同的數(shù)據(jù)源類型SQL會存在部分差異,那么我們就可以使用alibaba 的druid包實現(xiàn)不同的數(shù)據(jù)源類型的sql解析,需要的朋友可以參考下
    2023-08-08
  • 談Java static關鍵字的用法與好處

    談Java static關鍵字的用法與好處

    這篇文章主要為大家詳細介紹了Java static關鍵字的用法與好處,感興趣的朋友可以參考一下
    2016-05-05
  • 如何修改FeginCilent定義的服務名到指定服務

    如何修改FeginCilent定義的服務名到指定服務

    這篇文章主要介紹了修改FeginCilent定義的服務名到指定服務的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java內存異常使用導致full?gc頻繁

    java內存異常使用導致full?gc頻繁

    Full?GC是Java虛擬機中垃圾回收的一種方式,它會暫停應用程序所有的線程并清理整個堆內存。頻繁的Full?GC會導致應用程序的性能下降,甚至出現(xiàn)長時間的停頓。Java內存異常使用常常是Full?GC頻繁出現(xiàn)的原因之一,如使用大量的靜態(tài)變量、內存泄漏等。
    2023-04-04
  • 解決feignClient調用時獲取返回對象類型匹配的問題

    解決feignClient調用時獲取返回對象類型匹配的問題

    這篇文章主要介紹了解決feignClient調用時獲取返回對象類型匹配的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實現(xiàn)克隆的三種方式實例總結

    Java實現(xiàn)克隆的三種方式實例總結

    這篇文章主要介紹了Java實現(xiàn)克隆的三種方式,結合實例形式總結分析了java淺復制、深復制以及使用serializable實現(xiàn)深復制的相關操作技巧,需要的朋友可以參考下
    2018-08-08

最新評論

宝坻区| 威宁| 磴口县| 渭源县| 寻甸| 哈巴河县| 驻马店市| 南溪县| 石渠县| 平遥县| 平远县| 资中县| 都匀市| 太保市| 盘山县| 汾阳市| 闵行区| 绥宁县| 盐城市| 来宾市| 山东省| 桑日县| 清河县| 阿拉善盟| 富平县| 平谷区| 华阴市| 郸城县| 胶南市| 西青区| 锡林浩特市| 农安县| 宜君县| 合江县| 乐昌市| 齐齐哈尔市| 文成县| 凤山县| 贵南县| 栾川县| 黄石市|