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

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

6604e88648b803d49b31442b714e6e1f.png

在书中,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"

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨浏览器开发工作小结

本篇小结是在2011年时候总结的,当时做一个产品的跨浏览器兼容工作,由于产品开发的时间比较早,最开始只能在IE下面(IE 8、IE 9还有点点问题)使用,做跨浏览器兼容工作的时候,主要是适配IE 6--IE 9、Safari、FireFox、Chr…

冠榕智能灯光控制协议分析(node-controller)

1. 在Z-WAVE PC Controller软件选择已配对的智能开关。 从上图中可以看到,我们的智能开关的node id是11,即0x0B。 2. 按下智能开关,用串口工具可以看到以下信息。 01 0D 00 04 00 0B 07 60 0D 01 01 00 03 FF 6B 01 0D 00 04 00 0B 07 60…

Makefile 的 遗漏分隔符错误信息

Makefile的编写中不可以有空格,留白必须按tab键形成的。 去掉空格,改为tab键后,再执行make命令,就会成功。 学习Makefile可以参考一下链接: http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/ 转载于:htt…

冠榕智能灯光控制协议分析(controller-node) 2

z-wave第一篇,我们用COMMAND_CLASS_BASIC - BASIC_SET控制智能开关。但是智能开关上有两个执行器,我们只能控制其中一路,那么我们如何控制另一路的开关的。在z-wave第二篇,我们分析了智能开关两个按键发送的消息,发现&…

java修改pdf内容流_java – 在PDFBox中,如何更改PDRectangle对象的原点(0,0)?

你可以稍微改变坐标系,但最有可能的事情不会变得更加优雅.首先……首先让我们澄清一些误解:你假设In PDFBox, PDRectangle objects’ default origin (0,0) seems to be the lower-left corner of a page.对于所有情况都不是这样,仅仅是经常.包含显示的页面区域(在纸…

基于visual Studio2013解决面试题之0902内存拷贝

题目解决代码及点评/*用 C 语言实现函数 void * memmove(void *dest,const void *src,size_t n)memmove 函数的功能是拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址上。 简单循环拷贝即可,但是这道题,要深…

冠榕智能灯光控制协议分析(controller init)

上面几篇已经详细介绍了z-wave协议的分析方法,这一章,我们分析z-wave pc controller初始化时的通信信息。我们只将关键信息列出,然后直接将分析出来的串口数据列出。 1. 得到z-wave版本 01 03 00 15 E9 06 01 10 01 15 5A 2D 57 61 76 65…

jmeter找不到java_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...

最近在做一个开放接口平台性能测试 , 指标是最少达到1000/s的并发 , 接口鉴权 百万级的表 在1s内完成..在众多压测工具中 ,,选择了Apache的jmeter ,于官网下载了最新版本http://jmeter.apache.org/download_jmeter.cgi (jmeter下载地址)由于jmeter运行是基于java的,所以需要…

java 第三方库

总结一下常用的java第三方库,方便查询和使用,欢迎补充。 1、核心库 Apache Commons Lang:来自Apache的核心库,为java.lang API补充了许多常用的工具类,如字符串操作、对象的创建等。 Google Guava:来自谷歌…

ZDB5304烧写方法

1. 跳线和5304的位置如下图 2. 打开z-wave programmer软件,设置如下图,注意烧写接口为uart,烧写的时候会提示的。选yes是uart,选no是spi。 烧写过程中会提示按下reset或释放reset按键。照做即可。 烧完后&#xff0c…

Java多进程测试用例_Pytest xdist/Pytest并行多进程执行测试用例,pytestxdistpytestparallel...

如果想分布式执行用例,用例设计必须遵循以下原则:1.用例之间都是独立的,2.用例a不要去依赖用例b3.用例执行没先后顺序,4.随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例这跟就我们平常多个…

【转】宇宙的基本法则

开宗明义,“复制因子→复制→成长→自然选择”法则是支配宇宙的基本法则,为了方便,我称其为“B法则” 。所谓复制,就是在一 定条件下一个复制因子一旦形成,就会一直不停地复制自身,不断成长,比…

java jni librtmp_librtmp 编译集成

RTMPDumpRTMPDump 是一个用来处理RTMP流媒体的开源工具包。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。在根目录下提供了一个Makefile与一些.c源文件。这里的…

基于Z-Wave无线技术的指纹锁系统设计

http://www.chinaaet.com/article/218940 摘 要: 结合新兴的低功耗的Z-Wave短距无线通信技术,设计一种应用于酒店的智能指纹锁无线管理与控制系统。该系统的门锁硬件电路包括主控制器S3C2440、指纹采集模块、电机驱动模块及ZM3102无线模块,…

Hibernate一对一关联------主键关联(亲测成功)

1、创建两个实体(Company.java和Login.java)代码如下: 1 package wck.stu.vo.onetoonein;2 3 public class Company {4 private String id "";5 6 private String companyName "";7 8 private Str…

angularjs mysql_AngularJS SQL

AngularJS SQL在前面章节中的代码也可以用于读取数据库中的数据。使用 PHP 从 MySQL 中获取数据AngularJS 实例{{ x.Name }}{{ x.Country }}function customersController($scope,$http) {var site "http://www.w3cschool.cn";var page "/statics/demosource/…

INTEL和AMD两大巨头的前身

仙童半导体公司,曾经是世界上最大、最富创新精神和最令人振奋的半导体生产企业,为硅谷的成长奠定了坚实的基础。更重要的是,这家公司还为硅谷孕育了成千上万的技术人才和管理人才,它不愧是电子、电脑业界的“西点军校”&#xff0…

servlet加载资源两种方式-内外(初始化参数).properties文件

在servlet中加载资源很方便,通过servletContext,这个是web服务器加载完web项目返回的参数之一,还有servletConfig,得到web项目一些配置信息,request和response,等等,我们现在用的这个servletContext也叫做C…

java 登录编程_Java编程通过session访问需要登录的页面

使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的网站地址即可,然后对返回的html源码进行处理分析,获取感兴趣的内容。不过如果是需要登录后才能访问的网页就不能直接传入网站url进行连接了&am…

ZDB5202烧成控制器方法

1.跳线和ZDB5202的安装位置如下图 黄色开关设置为off状态,就是靠近班子里面的一方。 2.打开z-wave programmer软件,设置如下图,注意烧写接口为spi,烧写的时候会提示的。选yes是uart,选no是spi。…