- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 OO 设计模式很陌生,对 Java 也比较陌生。
我的问题是关于 Head First Designer Patterns Starbuzz 示例中的 Decorator 示例。
我无法理解外层包装器如何调用内层包装器,尤其是这些示例中的描述是如何连接起来的。
例如:
这是摩卡类(装饰):
public class Mocha extends CondimentsDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription()
{
return beverage.getDescription() + " , Mocha";
}
public double cost()
{
return .20 + beverage.cost();
}
}
这是 Beverage 类(基础):
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription()
{
return description;
}
public abstract double cost();
}
深色烘焙类:
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast";
}
@Override
public double cost() {
return .99;
}
}
所以,如果我运行这个:
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
输出是:
Dark Roast , Mocha , Mocha $1.39
我不明白描述和成本是如何加在一起的?如何保持描述和成本的状态?我在这里遗漏了什么明显的东西吗?
最佳答案
如果您不重复使用名称,将会有所帮助。
假设您将代码编写为:
Beverage roast = new DarkRoast();
mocha = new Mocha(roast);
doubleMocha = new Mocha(mocha);
System.out.println(doubleMocha.getDescription() + " $" + doubleMocha.cost());
变量 mocha
是摩卡咖啡,mocha.beverage == roast
是 DarkRoast。
变量 doubleMocha
是摩卡咖啡,doubleMocha.beverage == mocha
是摩卡咖啡。
请注意 doubleMocha.beverage.beverage == roast
。成本也可以委托(delegate)给链条:
dobleMocha.cost() == .20 + doubleMocha.beverage.cost()
== .20 + mocha.cost()
== .20 + .20 + mocha.beverage.cost()
== .20 + .20 + roast.cost()
== .20 + .20 + 1.99 = 2.39
你可以用同样的方法计算出 doubleMocha.description()
。
随着您的进步,您会学到更多东西。
float
或double
。你有没有见过天真的代码的结果,比如对你的 2.99 美元的商品征收 4.5% 的税,并报告为 3.12455 美元?也很容易四舍五入不正确。如果你能找到以下书籍的二手副本,请购买:
它对这种类型的代码有很好的描述。
顺便说一句,仅使用一个变量名的原始代码之所以有效,是因为首先将变量设置为 DarkRoast
对象。然后例程创建一个使用 DarkRoast
对象的 Mocha
对象,一旦实例变量设置为 Mocha
对象,原始 DarkRoast
仍然很容易访问。垃圾收集器不会处理它。
关于design-patterns - Head First 设计模式 - 装饰器模式描述/成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725365/
目前,我正在为网络开发类(class)做作业。 这些是说明:第一行和首字下沉样式Jakob 希望文章的第一行以小写大写字母显示。转到 First Line and Drop Cap Styles 部分
.first() 方法是在 jQuery 1.4 中添加的。 :first 选择器自 1.0 以来就已存在。 来自文档: :first The :first pseudo-class is equiv
我正在审查现有的 ASP.NET MVC (5.2.3) EF (6.1.3) 项目。 该项目使用 ASP.NET Identity,我检查了 web.config 中的 2 个连接字符串,一个用于
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
for(auto it = M.begin(); it!=M.end();it++) { coutfirstsecondsecond == 1) return it->firs
我试图从第二个循环中获取循环的第一项。 我知道我得到了这样的@key @../key 但@first 似乎不像@../first 那样工作 有什么想法吗? 问候 最佳答案 首先,无论是否在嵌套 blo
var tab1 = $('.tabs a:first-child').attr('href'); alert(tab1); .. 尽管同一页面上有两个 div.switch,但仅匹配一个。第二个位于
我想知道如何将节点*变量 NODE 分配给结构内的数据? struct node { int info; struct node *link; }; typedef struct nod
我有两个段落包含在一个 div 中。我想让第一段的文字变大一点,但使用 :first-child 并不能像我所说的那样工作。看不出有什么问题。
我有一个 ul li 列表 Parent child1 child2
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
这有什么区别吗: myList.Where(item => item == 0).First(); 还有这个: myList.First(item => item == 0); 后者对我来说更有意义,
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
当我遇到一个奇怪的情况时,我正在研究 CSS 选择器。 如果我使用 :first-child 伪元素,我需要在它前面加上一个空格才能工作,否则它将无法工作。然而 :first-letter 伪元素的情
请考虑以下字符串数组: let strings = ["str1", "str2", "str10", "str20"] 假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 fil
让我们假设我们要开始新项目 - 包含一些业务逻辑的应用程序、ASP.NET 上的用户界面、WPF 或两者。我们想使用 ORM 或 DAL 代码生成器并在 .NET 类中实现我们的业务逻辑。我们可以通过
我有一种树系统。我想做的是给所有 parent 一个 margin ,除了第一个。这是我的 HTML: Test
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
我是一名优秀的程序员,十分优秀!