Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用一点java,一点模式设计类?_Java_Design Patterns_Computer Science - Fatal编程技术网

用一点java,一点模式设计类?

用一点java,一点模式设计类?,java,design-patterns,computer-science,Java,Design Patterns,Computer Science,我最近在读,第3章介绍了Pizza类及其一些子类。我觉得奇怪的是,外壳、奶酪和橄榄类被定义为比萨饼的子类 显然,这些是比萨饼的成分,这些成分和比萨饼之间的关系是有一个而不是是一个 那么为什么这些配料类被定义为比萨饼的子类呢 仅供参考,下面的代码片段是本书中使用的类结构。 它们听起来像是比萨饼的类型;这将使它成为一种关系(蘑菇披萨就是披萨)。刘家才,我不知道这本书,但你的怀疑是合理的。在编写良好的OOP代码中,Pizza应该是一个包含一组成分的对象。示例中扩展Pizza的每个类都应该实现配料接口:

我最近在读,第3章介绍了
Pizza
类及其一些子类。我觉得奇怪的是,
外壳
奶酪
橄榄
类被定义为
比萨饼
的子类

显然,这些是比萨饼的成分,这些成分和比萨饼之间的关系是
有一个
而不是
是一个

那么为什么这些配料类被定义为比萨饼的子类呢

仅供参考,下面的代码片段是本书中使用的类结构。

它们听起来像是
比萨饼的类型;这将使它成为一种关系(蘑菇披萨就是披萨)。

刘家才,我不知道这本书,但你的怀疑是合理的。在编写良好的OOP代码中,Pizza应该是一个包含一组成分的对象。示例中扩展Pizza的每个类都应该实现配料接口:

class Pizza {
  private Set<Ingredient> ingredients;
  //code
}

interface Ingredient {}

class Crust implements Ingredient {}
class Cheese implements Ingredient {}
class Olive implements Ingredient {}
class比萨饼{
私设食材;
//代码
}
界面成分{}
类{}
类{}
类{}

子类的名称有些误导<例如,代码>香肠
,不是一种配料;这是一种披萨,上面涂有香肠,
奶酪
橄榄
,和
凤尾鱼
<代码>硬皮
实际上是一个没有任何配料的比萨饼。通过这种方式考虑比萨饼,可以实现简单的递归描述:

  • 普通的面包皮就是比萨饼
  • 如果你拿一个比萨饼,在上面加奶酪,结果就是一个比萨饼
  • 如果你拿一个比萨饼,在上面加上香肠,结果就是一个比萨饼
  • 如果你拿一个比萨饼,在上面加上凤尾鱼,结果就是一个比萨饼
  • 如果你拿一个比萨饼,在上面加上橄榄,结果就是一个比萨饼
castle
是递归的基本情况,“toppings”对
Pizza
进行递归调用。这就是为什么“toppings”有一个
Pizza
字段:子类告诉您生成的Pizza的最顶层是什么,该字段告诉您底层是什么

这也使得递归定义方法变得容易。假设我们想检查比萨饼是否是素食者:

  • 如果比萨饼是纯皮的,那么就没有肉,所以比萨饼是素食的。(基本情况:正确)

  • 否则,比萨饼由顶层和子比萨饼组成

  • 首先检查顶层。如果顶层是香肠或凤尾鱼,那么比萨饼就不是素食者。(基本情况:错误)

  • 否则,顶层是奶酪或橄榄。在这种情况下,比萨饼是素食的,如果并且只有顶层下面的子比萨饼是素食的

  • 检查sub pizza是否是素食者。(递归)


如果这些名字真的让你感到困扰,你可以将
crask
重命名为
pizzawithnotappings
lean
重命名为
PizzaToppedWithSausage
,依此类推。这些名字很难看,根本不适合像《小Java》这样的文体书籍。

尽管书名包含Java,但它不是一本关于Java的书。表面上看,它是在用Java教授函数式编程

这是理解这些例子的关键。对于exmaple,第一章实际上是关于通常在函数式编程语言(如ML)中可以找到的Union数据类型(或sum数据类型)

在本书中,它没有使用任何集合概念,如集合、映射或列表。相反,作者教您创建这些概念


如果您熟悉haskell或SML中的列表类型,那么这些定义应该非常自然。

我们看不到有问题的文本,因此只能猜测。我怀疑你误解了课文的内容;如果没有,那么文本是错误的。这些都不是比萨饼的子类。正如@chrylis所说,亚马逊网站对这本书的评论是有争议的。有很多更好的书可以花你的时间在上面。我不认为是这种情况。我已经上传了课程结构,如果你看一下这本书并回答这个问题会更好quesiton@JiacaiLiu本文描述了一种通用的
Pizza
类型,以及作为具体实现的子类
Pizza
Olive extends Pizza
Pizza
是一个
集合
(具体来说,作者试图用a来解释)。我仍然不明白,在
Cheese
和其他子类中,为什么会有
Pizza
字段,这是建筑商模式的一种变体吗?真的没有明智的方法来理解
类结壳扩展比萨饼。
@jiacailu结壳不是比萨饼(它是比萨饼的一部分)。继承被滥用了。这个设计不尊重环境。这本书是1998年出版的。在流行的GoF书籍之后,一些“模式”书籍应运而生。在我看来,很多都是浪费时间。如果你想要一些有价值的东西,我建议你采用头优先的设计模式。