一点java的类设计,有点模式?

时间:2016-01-31 06:20:44

标签: java design-patterns computer-science

我最近在阅读A Little Java, A Few Patterns,第3章介绍了<div v-for="week in weeksInMonth"> <cal-week class='cal-week' :weekdata="events['events-week' + $index]" :events="events"></cal-week> </div> 类及其子类。 PizzaCrustCheese类被定义为Olive

的子类,这对我来说很奇怪

显然,这些是披萨的成分,这些成分和披萨之间的关系是Pizza而不是has a

那么为什么那些成分类被定义为is a的子类?

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

4 个答案:

答案 0 :(得分:1)

听起来他们可能被描述为Pizza类型;这将使它成为一个 is-a 关系(蘑菇披萨披萨)。

答案 1 :(得分:1)

子类的名称有些误导。例如,Sausage不是顶部;这是一个披着香肠的披萨,CheeseOliveAnchovy也是如此。 Crust真是一个没有任何浇头的披萨。以这种方式思考比萨饼可以实现简单的递归描述:

  • 普通地壳是披萨。
  • 如果你拿披萨并在上面加奶酪,结果就是披萨。
  • 如果你拿披萨并在上面加香肠,结果就是披萨。
  • 如果你吃比萨饼并在上面添加凤尾鱼,结果就是披萨。
  • 如果你拿披萨并在上面加橄榄,结果就是披萨。

Crust是递归的基本情况,'toppings'对Pizza进行递归调用。这就是'浇头'有一个Pizza字段的原因:子类告诉你生成的披萨的最顶层是什么,字段告诉你底层是什么。

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

  • 如果披萨是一块普通的外壳,那么就没有肉了,所以披萨是素食主义者。 (基本情况:真实)

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

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

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

  • 检查子披萨是否是素食主义者。 (递归)

如果名称确实让您感到困扰,可以将Crust重命名为PizzaWithNoToppings,将Sausage重命名为PizzaToppedWithSausage,依此类推。这些名字非常丑陋,并且完全不适合像 A Little Java 这样的风格书。

答案 2 :(得分:1)

虽然这本书的标题包含Java,但它并不是一本关于Java的书。表面上,它是使用Java教授函数式编程。

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

在本书中,它不使用任何集合概念,如set,map或list。相反,作者教你创建这些概念。

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

答案 3 :(得分:0)

刘嘉斋,我不懂这本书,但你的疑惑是合理的。在写得好的OOP代码中,Pizza应该是一组具有一系列成分的对象。并且在示例中扩展Pizza的每个类都应该实现Ingredient接口:

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

interface Ingredient {}

class Crust implements Ingredient {}
class Cheese implements Ingredient {}
class Olive implements Ingredient {}