适用于以下情况:

(1)需要扩展一个类的功能,或给一个类添加附加职责。

(2)需要动态的给·一个对象添加功能,这些功能可以再动态的撤销。

(3)需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

(4)当不能采用生成子类的方法进行扩充时,一种情况是:可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目爆炸性增长,另一种情况可能是因为类定义被隐藏,或定义不能用于生成子类。

(设计者模式能提供更多的灵活性,创造出更多不同行为的组合)

(设计者模式会导致,设计中出现许多小类,如果过度使用,会是程序变得很复杂)

(装饰者模式是针对抽象组件类型编程,但是如果要是针对具体组件编程,就应该重新思考应用架构,以及装饰者是否合适)

抽象构件类:

 public abstract class Breskfast {
private String desciption = "未知";
public String getDesciption() {
return desciption;
}
public void setDesciption(String desciption) {
this.desciption = desciption;
}
public abstract double cost();
}

抽象装饰类:

 public abstract class CondimentDecorator extends Breskfast{
private Breskfast myfood; public Breskfast getMyfood() {
return myfood;
}
public CondimentDecorator(Breskfast myfood) {
super();
this.myfood = myfood;
} @Override
public String getDesciption() {
return myfood.getDesciption(); }
@Override
public double cost() {
return myfood.cost();
} }

具体构件类:

 public class Toast extends Breskfast{
public Toast() {
this.setDesciption("吐司");
} @Override
public double cost() {
return 10;
} }

具体装饰类:

 public class Ham extends CondimentDecorator{

     public Ham(Breskfast myfood) {
super(myfood);
} @Override
public double cost() {
return super.cost()+10;
}
@Override
public String getDesciption() {
return super.getDesciption()+",火腿";
} }

客户测试类:

 public class Decorator {

     public static void main(String[] args) {
//点一份吐司
Breskfast breskfast = new Toast();
System.out.println(breskfast.getDesciption()+"价格为:"+breskfast.cost());
//加两份火腿
breskfast = new Ham(breskfast);
breskfast = new Ham(breskfast);
// System.out.println(breskfast.desciption);
System.out.println(breskfast.getDesciption()+"价格为:"+breskfast.cost());
} }

装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)的更多相关文章

  1. 装饰者模式 Decorator

    项目:咖啡计费系统 背景:现有系统中有一个抽象类Beverage,有2个抽象方法GetDescription和Cost. namespace DecoratorPattern { /// <su ...

  2. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

  3. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  4. 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

    <?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...

  5. 装饰器模式(Decorator)

    转自http://blog.csdn.net/hust_is_lcd/article/details/7884320 1.认识装饰器模式 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象 ...

  6. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  7. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  8. 装饰器模式(Decorator)——深入理解与实战应用

    本文为原创博文,转载请注明出处,侵权必究! 1.初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装 ...

  9. 设计模式 - 装饰者模式(Decorator Pattern) 具体解释

    装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...

  10. 装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

随机推荐

  1. UVA-307-Sticks-dfs+剪枝

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  2. IMS Call中的SS

    1Hold procedure:对于每一个被HOLD的媒体流,SDP包含: 如果流之前被设置为“recvonly”媒体流则是一个“不活动”的SDP属性: 如果先前将流设置为“sendrecv”媒体流则 ...

  3. 第五篇:zTree节点的一些操作,权当备份

    项目场景:将zTree的一个节点挪到某个已知的根节点下,因为树上的节点都是数据库查询出来的,所以不能直接用addNodes()这个方法(否则一刷新又恢复原样了),而是要把这个节点及其某些属性数据保存到 ...

  4. Jumpserver-1.5.2 安装步骤

    Jumpsever 是飞致云旗下的一块开源的堡垒机.在如今都在上云的趋势下,一款堡垒机非常重要. 官网:http://jumpserver.org/ GitHub:https://github.com ...

  5. 面试系列17 redis cluster

    1.redis cluster介绍 redis cluster (1)自动将数据进行分片,每个master上放一部分数据(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的 在re ...

  6. 使用CEfSharp之旅(4)cefsharp 调用F12

    原文:使用CEfSharp之旅(4)cefsharp 调用F12 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://bl ...

  7. Nginx 教程 1:基本概念

    简介 我们会告诉你 Nginx 是如何工作的,其背后的概念有哪些,以及如何优化它以提升应用程序的性能.还会告诉你如何安装,如何启动.运行. 这个教程包括三节: 基础概念——你可以了解命令(direct ...

  8. ajax无刷新上传

    我们在使用上传控件的时候,会遇到刷新的问题,最近使用ajax做的上传,觉得效果还是很不错. 首先,我们需要在页面上放上上传控件:需要注意的是,我们必须放在form里面,实现表单上传.  <for ...

  9. 锋利的Jquery(点击显示隐藏div)

    点击显示隐藏div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  10. gulp 前端构建工具使用

    gulp 前端构建工具使用 1.新建一个web  h5项目 2.准备好gulpfile.js文件 (1)下载链接:https://pan.baidu.com/s/116J-BaYOMRzeJW3i_J ...