首页 > 编程 > Java > 正文

Java基于装饰者模式实现的染色馒头案例详解

2019-11-26 09:59:47
字体:
来源:转载
供稿:网友

本文实例讲述了Java基于装饰者模式实现的染色馒头案例。分享给大家供大家参考,具体如下:

一、模式定义

装饰者模式,是在不改变原类文件和使用继承的情况下,动态扩展一个对象功能,它是通过创建一个包装对象,也就是装饰来包装真实的对象。

装饰对象和真实对象有相同接口,这样客户端对象就可以和真实对象相同方式和装饰对象交互。

装饰对象包含一个真实对象的引用。

二、模式举例

1. 模式分析

我们借用黑心商贩制做染色馒头案例说明这一模式。

 

2. 装饰者模式静态类图

 

3. 代码示例

3.1 创建馒头接口――IBread

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

3.2 正常馒头实现――NormalBread

package com.demo.abs;/** * 正常馒头的实现 * * @author * */public class NormalBread implements IBread {  // 准备材料  public void prepair() {    System.out.println("准备面粉、水以及发酵粉...");  }  // 和面  public void kneadFlour() {    System.out.println("和面...");  }  // 蒸馒头  public void steamed() {    System.out.println("蒸馒头...香喷喷的馒头出炉了!");  }  /**   * 加工馒头方法   */  public void process() {    // 准备材料    prepair();    // 和面    kneadFlour();    // 蒸馒头    steamed();  }}

3.3 创建抽象装饰者――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 创建染色剂装饰者――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 创建甜蜜素装饰者――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====开始装饰馒头!!!");    // 创建普通的正常馒头实例    // 这是我们需要包装(装饰)的对象实例    IBread normalBread = new NormalBread();    // 下面就开始 对正常馒头进行装饰了!!!    // 使用甜蜜素装饰馒头    normalBread = new SweetDecorator(normalBread);    // 使用柠檬黄的着色剂装饰馒头    normalBread = new CornDecorator(normalBread);    // 生产馒头信息    normalBread.process();    System.out.println("====装饰馒头结束!!!");  }}

4. 运行结果

====开始装饰馒头!!!
准备面粉、水以及发酵粉...
添加柠檬黄的着色剂...
添加甜蜜素...
和面...
蒸馒头...香喷喷的馒头出炉了!
====装饰馒头结束!!!

三、该模式设计原则

1 封闭变化部分
2 “开一闭"原则
3 面向抽象编程
4 优先使用组合,而非继承

四、使用场合

1. 当我们需要为某个现有对象动态增加一个新功能或职责时,可以考虑使用装饰者模式。

2. 当某个对象的职责经常发生变化或经常需要动态增加职责,避免为了适应这样的变化而增加继承子类扩展的方式,因为这种方式会造成子类膨胀速度过快,难以控制,此时可以使用装饰者模式。

五、装饰者模式静态类图

 

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表