欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

一、模式定義

裝飾者模式,是在不改變?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

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

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

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

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

package com.demo.decorator;
import com.demo.abs.IBread;
/**
 * 抽象裝飾者
 *
 * @author
 *
 */
public abstract class AbstractBread implements IBread {
  // 存儲(chǔ)傳入的IBread對(duì)象
  private final IBread bread;
  public AbstractBread(IBread bread) {
    this.bread = bread;
  }
  // 準(zhǔn)備材料
  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 {
  // 構(gòu)造方法
  public CornDecorator(IBread bread) {
    super(bread);
  }
  // 黑心商販 開(kāi)始染色了
  public void paint() {
    System.out.println("添加檸檬黃的著色劑...");
  }
  // 重載父類的和面方法
  @Override
  public void kneadFlour() {
    // 在面粉中加入 染色劑 之后才開(kāi)始和面
    this.paint();
    // 和面
    super.kneadFlour();
  }
}

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

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

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

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

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

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

三、該模式設(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)類圖

 

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

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一篇文章帶你深入了解Java線程池

    一篇文章帶你深入了解Java線程池

    這篇文章主要介紹了Java 線程池的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望能給你帶來(lái)幫助
    2021-08-08
  • JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解

    JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解

    this關(guān)鍵字用于引用當(dāng)前對(duì)象的引用,super關(guān)鍵字用于引用父類對(duì)象的引用,下面這篇文章主要給大家介紹了關(guān)于JavaSE面試題之this與super關(guān)鍵字區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • SpringBoot 多數(shù)據(jù)源及事務(wù)解決方案小結(jié)

    SpringBoot 多數(shù)據(jù)源及事務(wù)解決方案小結(jié)

    本文主要介紹了多數(shù)據(jù)源管理的解決方案(應(yīng)用層事務(wù),而非XA二段提交保證),以及對(duì)多個(gè)庫(kù)同時(shí)操作的事務(wù)管理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 如何通過(guò)zuul添加或修改請(qǐng)求參數(shù)

    如何通過(guò)zuul添加或修改請(qǐng)求參數(shù)

    這篇文章主要介紹了如何通過(guò)zuul添加或修改請(qǐng)求參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java使用Log4j記錄日志的方法詳解

    Java使用Log4j記錄日志的方法詳解

    log4j是一個(gè)常用的日志框架,用于記錄應(yīng)用程序的執(zhí)行過(guò)程或異常等記錄在日志文件中。本文將利用Log4j記錄日志,感興趣的可以了解一下
    2022-03-03
  • MyBatis的五種批量插入詳解

    MyBatis的五種批量插入詳解

    這篇文章主要介紹了MyBatis的五種批量插入詳解,MyBatis是一款半自動(dòng)的ORM持久層框架,具有較高的SQL靈活性,支持高級(jí)映射(一對(duì)一,一對(duì)多),動(dòng)態(tài)SQL,延遲加載和緩存等特性,但它的數(shù)據(jù)庫(kù)無(wú)關(guān)性較低,需要的朋友可以參考下
    2023-08-08
  • Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼

    Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 基于struts2和hibernate實(shí)現(xiàn)登錄和注冊(cè)功能

    基于struts2和hibernate實(shí)現(xiàn)登錄和注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了基于struts2和hibernate實(shí)現(xiàn)登錄和注冊(cè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 關(guān)于@Configuration的作用說(shuō)明

    關(guān)于@Configuration的作用說(shuō)明

    這篇文章主要介紹了關(guān)于@Configuration的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringMVC KindEditor在線編輯器之文件上傳代碼實(shí)例

    SpringMVC KindEditor在線編輯器之文件上傳代碼實(shí)例

    這篇文章主要介紹了SpringMVC KindEditor在線編輯器之文件上傳代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論