装饰模式

1.概念

动态地为对象附加上额外的职责

其目的是包装一个对象,从而可以在运行时动态添加新的职责。每个装饰器都可以包装另一个装饰器,这样理论上来说可以对目标对象进行无限次的装饰。

2.装饰器类图

3.代码

一个早餐店经营两种主食:汉堡和吐司,一段时间后需要加个配料。

主要思路是:以主食(汉堡、吐司)为主体,然后再运行时以配料(火腿、起司)装饰为主食。其UML图为:



(1)抽象构建类————Breakfast.java,早餐的抽象父类

public abstract class Breakfast {
public String description="未知";
public String getDescription(){
return description;
}
public abstract Double cost();
}

(2)抽象装饰类————CondimentDecorator.java,是早餐抽象类的子类

public abstract class CondimentDecorator extends Breakfast{
Breakfast myfood;
public CondimentDecorator(Breakfast myfood){
this.myfood=myfood;
}
@Override
public String getDescription(){
return myfood.getDescription();
}
@Override
public Double cost(){
return myfood.cost();
}
}

(3)具体构建类————Toast.java、Burger.java

Toast.java

public class Toast extends Breakfast {
public Toast(){
description="吐司";
}
public Double cost(){
return 10d;
}
}

Burger.java

public class Burger extends Breakfast {
public Burger(){
description="汉堡";
}
@Override
public Double cost(){
return 15d;
}
}

(4)具体装饰类————Cheese.java、Ham.java

Cheese.java

public class Cheese extends CondimentDecorator {
public Cheese(Breakfast myfood) {
super(myfood);
} @Override
public Double cost() {
return super.cost() + 5;
} @Override
public String getDescription() {
return super.getDescription() + ",起司";
}
}

Ham.java

public class Ham extends CondimentDecorator {
public Ham(Breakfast myfood) {
super(myfood);
} @Override
public Double cost() {
return super.cost() + 10;
} @Override
public String getDescription() {
return super.getDescription() + ",火腿";
}
}

(5)客户端测试类

public class Decorator {
public static void main(String args[]) {
Breakfast breakfast1 = new Toast();
System.out.println("您点的餐点为:" + breakfast1.getDescription() + "。价格为:" + breakfast1.cost());
Breakfast breakfast2 = new Toast();
breakfast2 = new Ham(breakfast2);
breakfast2 = new Ham(breakfast2);
System.out.println("您点的餐点为:" + breakfast2.getDescription() + "。价格为:" + breakfast2.cost());
Breakfast breakfast3 = new Burger();
breakfast3 = new Ham(breakfast3);
breakfast3 = new Cheese(breakfast3);
breakfast3 = new Cheese(breakfast3);
System.out.println("您点的餐点为:" + breakfast3.getDescription() + "。价格为:" + breakfast3.cost());
}
}

结果

您点的餐点为:吐司。价格为:10.0
您点的餐点为:吐司,火腿,火腿。价格为:30.0
您点的餐点为:汉堡,火腿,起司,起司。价格为:35.0

详细见:Java设计模式

装饰者模式——Java设计模式的更多相关文章

  1. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  2. 悟空模式-java设计模式

    目前已定义的java设计模式细分下来有二十余种,这篇博客主要是想从大家所熟知的孙悟空入手,阐述各个设计模式的概念和优缺点,以及他们之间的联系. 在下面介绍的每个设计模式里,都会有与西游记相关的具体案例 ...

  3. DecoratorPattern(装饰器模式)-----Java/.Net

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装

  4. 装饰者模式--Java篇

    装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活. 1.定义接口,可以动态的给对象添加职责. package com.lujie; p ...

  5. 工厂模式——java设计模式

    工厂模式 目录 何为工厂模式 工厂方法与抽象工厂 如何在Java EE中通过@Producers与@Inject注解实现工厂模式 如何创建自定义注解以及通过@Qualifier消除具体实现之间的歧义 ...

  6. 代理模式——java设计模式

    代理模式(Proxy Pattern) GoF中给出的代理模式的定义为: 代理模式给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 代理模式的英文叫做Proxy或Surrogate ...

  7. 生产者和消费者模式--java设计模式

    生产者和消费者: 就犹如在快餐店点餐一样,有多个打饭的,有不定时的人来买饭,买饭的人从快餐店自动取餐,如果快餐的库存数量达到下限值时,自动启动打饭的,补充盒饭. 通过while循环的方式,传入变量is ...

  8. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

  9. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

随机推荐

  1. Java输入输出技术

    输入输出分类     输入流,相对计算机来说是输入的,例如鼠标键盘操作,设备给计算机的信息     输出流,相对计算机来说是输出的,例如屏幕显示,计算机给设备的信息.   具体分类     基本流,I ...

  2. day21(Listener监听器)

    监听器只要分为监听web对象创建与销毁,监听属性变化,感知监听器. 1.监听web对象的创建与销毁 servletContextListener   监听ServletContext对象的创建和销毁 ...

  3. eclipse中ctrl+K失效

    从昨天开始eclipse中Ctrl+d和Ctrl+K就失效了,简直无法忍受 解决方案: Window --> preferences --> General --> keys

  4. nutch相关目录说明

    Nutch数据包含3个目录结构,分别是: 1.Crawldb:用于存储Nutch将要检索的url信息,以及检索状态(是否检索.何时检索) 2.Linkdb:用于存储每一个url所包含的超链接信息(包括 ...

  5. jvm虚拟机--堆内存

    reserved 保留区域 堆 所有对象实例都在这里分配内存. 是垃圾收集的主要区域("GC 堆").现代的垃圾收集器基本都是采用分代收集算法,主要思想是针对不同的对象采取不同的垃 ...

  6. android根据图片路径显示图片

    首先根据图片路径先创建一个文件path为图片路径:然后判断文件是否存在,如果存在,将图片显示出来. File file = new File(path); ImageView img = (Image ...

  7. vlookup返回多个结果

    http://www.360doc.com/content/12/1021/15/7665211_242782107.shtml =IFERROR(VLOOKUP(D2&ROW(A1),IF( ...

  8. 1.mybatis入门

    一:创建表 CREATE TABLE `country` ( `id` ) NOT NULL AUTO_INCREMENT, `countryname` varchar() DEFAULT NULL, ...

  9. ReportMachine常见问题

    ReportMachine常见问题 2012-06-22 12:26:50|  分类: Delphi|举报|字号 订阅     下载LOFTER我的照片书  |     1.不打印特定的MemoVie ...

  10. Android-okhttp

    在AndroidManifest.xml配置网络访问权限: <!-- 访问网络是危险的行为 所以需要权限 --> <uses-permission android:name=&quo ...