作者:Grey

原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html

模式名称

装饰者模式(Decorator Pattern)

需求

定义咖啡厅中的每一类咖啡,并且计算其价格。每类咖啡都可以增加配料,价钱会根据不同配料而改变。

解决方案

定义一个Beverage抽象类,用来表示饮料:

  1. public abstract class Beverage {
  2. public String description = "Unknown Description";
  3. public String getDescription() {
  4. return description;
  5. }
  6. public abstract double cost();
  7. }

每类咖啡继承这个抽象类,实现自己的cost()方法,

Espresso咖啡:

  1. public class Espresso extends Beverage {
  2. Espresso() {
  3. description = "Espresso";
  4. }
  5. @Override
  6. public double cost() {
  7. return 1.99d;
  8. }
  9. }

HouseBlend咖啡:

  1. public class HouseBlend extends Beverage {
  2. HouseBlend() {
  3. description = "HouseBlend";
  4. }
  5. @Override
  6. public double cost() {
  7. return .99d;
  8. }
  9. }

在这里,配料(CondimentDecorator)作为装饰者,也继承自Beverage类,是一个抽象类:

  1. public abstract class CondimentDecorator extends Beverage {
  2. public abstract String getDescription();
  3. }

具体配料继承这个装饰者,并包含一个Beverage类的引用,这个引用类就是要装饰的对象:

  1. public class Mocha extends CondimentDecorator{
  2. private Beverage beverage;
  3. Mocha(Beverage beverage) {
  4. this.beverage = beverage;
  5. }
  6. @Override
  7. public double cost() {
  8. return .2d+beverage.cost();
  9. }
  10. @Override
  11. public String getDescription() {
  12. return beverage.getDescription()+", Mocha";
  13. }
  14. }

测试代码:

  1. public class CoffeeTest {
  2. public static void main(String[] args) {
  3. Beverage beverage = new Espresso();
  4. System.out.println("Espresso cost : "+ beverage.cost() + " description:"+beverage.getDescription());
  5. Beverage beverage1 = new HouseBlend();
  6. beverage1 = new Mocha(beverage1); // HouseBlend 加一份mocha
  7. beverage1 = new Mocha(beverage1); // HouseBlend 再加一份mocha
  8. System.out.println("HouseBlend cost:"+beverage1.cost() + " description:"+beverage1.getDescription());
  9. }
  10. }

输出结果:

  1. Espresso cost : 1.99 description:Espresso
  2. HouseBlend cost:1.39 description:HouseBlend, Mocha, Mocha

完整代码: Decorator Pattern Source

《Head First 设计模式》之装饰者模式的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

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

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

  4. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  5. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  6. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  7. 实践GoF的23种设计模式:装饰者模式

    摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...

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

    刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...

  9. Head First 设计模式 --3 装饰者模式 开闭原则

    装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案.设计原则:1:封装变化2:多用组合,少用继承3:针对接口编程,不针对实现编程4:为对象之间的松耦合设计而努力5 ...

  10. [设计模式] 9 装饰者模式 Decorator

    转:http://www.jellythink.com/archives/171#prettyPhoto 什么是装饰模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对装饰模式 ...

随机推荐

  1. JQM (功能栏、导航条)

    在Mobile中导航条的基本结构: <div data-role="navbar"> ul>li>a </div> 其中含有“行(grid)”和 ...

  2. Get-FilewithExtension

    1: <# 2: 用途: 3: 根据指定的路径和文件类型查找出文件,显示其完整路径以及大小 4: 使用方法: 5: Get-FilewithExtension -path path1,path2 ...

  3. sublime text 如何新建,删除,重命名等问文件的快速操作

    引用自: stackoverflow 可以使用插件, Sidebar Enhancements, 按ctrl+shift+p 输入install package回车 搜索该插件后即可完成

  4. openCV C++ 代码笔记

    代码片段1 cv_contourMask_step_tmp=cv_contourMask.clone(); cv::Mat maskImage; UIImageToMat(pathimg, maskI ...

  5. CYQ.Data V5 从入门到放弃ORM系列:框架的优势

    前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化 ...

  6. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...

  7. (翻译)《Hands-on Node.js》—— Why?

    事出有因 为何选择event loop? Event Loop是一种推进无阻塞I/O(网络.文件或跨进程通讯)的软件模式.传统的阻塞编程也是用一样的方式,通过function来调用I/O.但进程会在该 ...

  8. 纸上谈兵: 图 (graph)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...

  9. 花一分钟来看看Worktile是如何为团队协作而生的

    团队协作,我们想的更深.更远.更多,花一分钟来看看我们特别奉献的故事,然后去注册一个账号,邀请小伙伴一起来工作,你会体会Worktile才是真正懂你的协作方式.

  10. xamarin UWP自定义圆角按钮

    uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...