java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...
我目前正在阅读《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:抽象装饰器类中的功能而不是装饰器...相关推荐
- python中编完类后到实例编写_[零基础学python]编写类之一创建实例
虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有. 本讲就要简单多了,尝试走一个类的流程. 说明:关于类的这部分,我参考了<Learning Pyth ...
- java类的定义的实例_《Java基础知识》Java类的定义及其实例化
类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public classDog { String name;intage;void ...
- java 解析器_高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
- java疯狂讲义第四版第五章答案_疯狂java讲义第五章笔记
1 定义类,成员变量和方法 类和对象 定义类 java的类名由一个或者多个有意义的单词组合而成,每个单词的首字母大写,其他的全部消协,并且单词之间没有分隔符. 成员变量:用于定义该类或者实例的所包含的 ...
- java语言程序设计教程翁恺第二版课后答案_《JAVA语言程序设计教程(第2版)/翁恺 肖少拥》翁恺,肖少拥著【摘要 书评 在线阅读】-苏宁易购图书...
第1章 Java语言概述 1.1 Java的历史 1.2 Java程序运行环境与特点 1.2.1 跨平台(Cross Platform)/可移植性(Portablc) 1.2.2 运行效率 ...
- java批量实现1对1关系的自动匹配_杂谈Java内存Webshell的攻与防
这篇文章主要以Tomcat为例子记录了一些关于Java内存Webshell利用与检测以及相关的思考. 内存Webshell的利用方式 现在的内存Websell的利用方式个人感觉可以分为以下三种: 1. ...
- java语言程序设计教程课后题答案魏永红_《Java语言程序设计教程》习题参考答案...
1 / 23 < Java 语 言 程 序 设 计 教 程 > 习 题 参 考 答 案 第 1 章 习题参考答案 一.选择题 1 . B 2 . D 3 . C 4 . B 5 . A 6 ...
- excel切片器_数据透视表真的是Excel中最强大的功能么?
如果在Excel中选最一个最强大的功能,90% 的人都会跟你说数据透视表. 到底数据透视表可能做哪些事情呢? 数据透视表可以帮助我们批量处理数据.呈现数据,Excel使用者对它的好感度爆棚啦.话不多说 ...
- java制作媒体播放器_用Java构造自己的媒体播放器
一.概述 首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度.本文的媒体播放器要达到如下目标: 媒体播放器是一个菜单驱动的简单AWT应用. 媒体播放器包含一 ...
最新文章
- Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别
- 动态规划的Matlab实现和实例分析
- mysql迁移cassandra_使用datax迁移cassandra数据
- python 监控jvm脚本
- 数据结构与算法——二叉树与图
- 用生产者和消费者模式实现奇数偶数不同线程交替输出
- VT技术开创普遍虚拟化计算时代
- php7++linux安装,安装PHP5和PHP7
- Java基础_学习笔记_13_类的多态性(二)
- layui tree ajax刷新,layer 刷新某个页面的实现方法
- 浅谈JavaScript代码预解析 + 示例详解
- struct (5.31)
- 中国程序员最爱读错的70个英文单词!注有正解
- 计算机三级数据库技术 知识点
- 常用公共数据集----数据获取
- win98 支持html5,90后第一次接触Windows98,20多年了,居然还有人使用!
- 四川师范大学地信概论(3- 空间数据模型)90分以上版本
- RAR压缩包密码如何解密
- SDI科普--- SD-SDI/HD-SDI/3G-SDI/12G-SDI
- 类图、用例图、时序图、状态图、活动图、流程图、顺序图(转)
热门文章
- Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方。
- 计算机d盘被拒绝访问了怎么办,如果硬盘分区被拒绝访问或无法访问该怎么办?...
- 第六章 相同的功能,不同的代码
- c语言写程序轮询是什么意思,单片机轮询按键程序
- mysql 数据库表锁死_mysql 数据库表被锁住了_Mysql数据库表锁死如何处理?
- vue-cli 3.0
- extern、static
- iOS 直接使用16进制颜色
- hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告
- .Net学习笔记----2015-06-30(超市收银系统01-仓库类)