我目前正在阅读《Head First Design Patterns》一书,在"Decorator"一章中有以下示例:

在书中,conditionmentDecorator类被描述为一个abstract decorator。下面是代码示例:

public abstract class CondimentDecorator extends Beverage {

public abstract String getDescription();

}

因此,基本上内部只是一个抽象方法,它强制所有子类从饮料类重写getDescription()方法。

这里是一个mocha类的代码示例,作为decorator。

public class Mocha extends CondimentDecorator {

Beverage beverage;

public Mocha(Beverage beverage) {

this.beverage = beverage;

}

public String getDescription() {

return beverage.getDescription() +", Mocha";

}

public double cost() {

return .20 + beverage.cost();

}

}

其他装修商(鞭子类,大豆类…)有完全相同的代码,除了硬编码的成本数字(.20)和名称(",摩卡")。

然后,我们通过将前一个对象传递给新的装饰器来使用这个装饰器模式。

Beverage beverage = new DarkRoast();

beverage = new Mocha(beverage);

beverage = new Mocha(beverage);

beverage = new Whip(beverage);

我的问题是,为什么不简单地将复制的功能从装饰器移到抽象装饰器?下面是我如何重构示例。

抽象装饰:

public abstract class CondimentDecorator extends Beverage {

private Beverage beverage;

protected CondimentDecorator(Beverage previousBeverage) {

this.beverage = previousBeverage;

}

@Override

public String getDescription() {

return beverage.getDescription() +"," + getAdditionName();

}

@Override

public double cost() {

return beverage.cost() + getAdditionCost();

}

public abstract String getAdditionName();

public abstract double getAdditionCost();

}

装饰代码:

public class Mocha extends CondimentDecorator {

public Mocha(Beverage beverage) {

super(beverage);

}

@Override

public String getAdditionName() {

return"Mocha";

}

@Override

public double getAdditionCost() {

return 0.20;

}

}

现在,对于我创建的每个新的装饰器,我都必须通过超类构造函数的构造函数提供以前的饮料对象,并且我需要重写仅返回特定装饰器的唯一值的方法。

这个代码可以吗?或者,如果我在抽象装饰器中具有功能,它是否完全改变了装饰器模式的要点?

您本质上是在问,如果您对decorator模式的实现进行了更改,那么您是否在改变它的使用点。相反,问问——装饰图案的意义是什么?如果你摸索的话,你会发现你仍然有饮料装饰师,不管有没有你的编辑。

这个代码很好。经常阅读课本(?)在他们的示例中呈现不太完美的代码,这样他们就可以专注于一个特定的概念(在本例中是装饰师),而不必关注其他细节。事实上,你找到了一种改进这本书代码的方法,这表明你实际上已经很好地理解了这个概念,能够智能地使用它,而不仅仅是从引用中复制粘贴。

我认为答案是你不想在一节课上做两件事。

CondimentDecorator做了一件事:连接两个饮料。它真的应该被命名为"MixDecorator"

当你把调料的共同方面分解成代码时,你需要创建另一个类,可以称之为"命名调料",并将名称和成本放在里面。

java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...相关推荐

  1. python中编完类后到实例编写_[零基础学python]编写类之一创建实例

    虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有. 本讲就要简单多了,尝试走一个类的流程. 说明:关于类的这部分,我参考了<Learning Pyth ...

  2. java类的定义的实例_《Java基础知识》Java类的定义及其实例化

    类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public classDog { String name;intage;void ...

  3. java 解析器_高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  4. java疯狂讲义第四版第五章答案_疯狂java讲义第五章笔记

    1 定义类,成员变量和方法 类和对象 定义类 java的类名由一个或者多个有意义的单词组合而成,每个单词的首字母大写,其他的全部消协,并且单词之间没有分隔符. 成员变量:用于定义该类或者实例的所包含的 ...

  5. java语言程序设计教程翁恺第二版课后答案_《JAVA语言程序设计教程(第2版)/翁恺 肖少拥》翁恺,肖少拥著【摘要 书评 在线阅读】-苏宁易购图书...

    第1章  Java语言概述 1.1  Java的历史 1.2  Java程序运行环境与特点 1.2.1  跨平台(Cross Platform)/可移植性(Portablc) 1.2.2  运行效率 ...

  6. java批量实现1对1关系的自动匹配_杂谈Java内存Webshell的攻与防

    这篇文章主要以Tomcat为例子记录了一些关于Java内存Webshell利用与检测以及相关的思考. 内存Webshell的利用方式 现在的内存Websell的利用方式个人感觉可以分为以下三种: 1. ...

  7. java语言程序设计教程课后题答案魏永红_《Java语言程序设计教程》习题参考答案...

    1 / 23 < Java 语 言 程 序 设 计 教 程 > 习 题 参 考 答 案 第 1 章 习题参考答案 一.选择题 1 . B 2 . D 3 . C 4 . B 5 . A 6 ...

  8. excel切片器_数据透视表真的是Excel中最强大的功能么?

    如果在Excel中选最一个最强大的功能,90% 的人都会跟你说数据透视表. 到底数据透视表可能做哪些事情呢? 数据透视表可以帮助我们批量处理数据.呈现数据,Excel使用者对它的好感度爆棚啦.话不多说 ...

  9. java制作媒体播放器_用Java构造自己的媒体播放器

    一.概述 首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度.本文的媒体播放器要达到如下目标: 媒体播放器是一个菜单驱动的简单AWT应用. 媒体播放器包含一 ...

最新文章

  1. Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别
  2. 动态规划的Matlab实现和实例分析
  3. mysql迁移cassandra_使用datax迁移cassandra数据
  4. python 监控jvm脚本
  5. 数据结构与算法——二叉树与图
  6. 用生产者和消费者模式实现奇数偶数不同线程交替输出
  7. VT技术开创普遍虚拟化计算时代
  8. php7++linux安装,安装PHP5和PHP7
  9. Java基础_学习笔记_13_类的多态性(二)
  10. layui tree ajax刷新,layer 刷新某个页面的实现方法
  11. 浅谈JavaScript代码预解析 + 示例详解
  12. struct (5.31)
  13. 中国程序员最爱读错的70个英文单词!注有正解
  14. 计算机三级数据库技术 知识点
  15. 常用公共数据集----数据获取
  16. win98 支持html5,90后第一次接触Windows98,20多年了,居然还有人使用!
  17. 四川师范大学地信概论(3- 空间数据模型)90分以上版本
  18. RAR压缩包密码如何解密
  19. SDI科普--- SD-SDI/HD-SDI/3G-SDI/12G-SDI
  20. 类图、用例图、时序图、状态图、活动图、流程图、顺序图(转)

热门文章

  1. Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方。
  2. 计算机d盘被拒绝访问了怎么办,如果硬盘分区被拒绝访问或无法访问该怎么办?...
  3. 第六章 相同的功能,不同的代码
  4. c语言写程序轮询是什么意思,单片机轮询按键程序
  5. mysql 数据库表锁死_mysql 数据库表被锁住了_Mysql数据库表锁死如何处理?
  6. vue-cli 3.0
  7. extern、static
  8. iOS 直接使用16进制颜色
  9. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告
  10. .Net学习笔记----2015-06-30(超市收银系统01-仓库类)