访问复合模式 Java 的叶子

Posted

技术标签:

【中文标题】访问复合模式 Java 的叶子【英文标题】:Access to the leafs of Composite pattern Java 【发布时间】:2017-04-15 05:00:37 【问题描述】:

我实现了复合模式来表示如图中的元素树:

但是我如何访问这棵树的叶子,比如叶子列表。我应该实现访客吗?

【问题讨论】:

展示你的实现 【参考方案1】:

叶子是这样实现的:

public class Leaf

  private List<Leaf> leaves;

  ......

为此,您理想情况下不需要任何其他设计模式。

您可以将其视为经理员工之间的关系。

作为员工的经理可以拥有在该经理手下工作的员工列表。

public class Employee

  private List<Employee> workingUnderHim;

  ......

【讨论】:

好的,谢谢;但是如果我想要一个所有叶子的列表,比如在这种情况下是所有员工的列表? @MaVeRicK_91 你想把它放在哪里?如果您需要从 Employee 类中获取员工列表,您可以为该字段设置一个 getter。 我不同意这一点。 Leaf 只是一片叶子,它对其他叶子一无所知。您给出的示例具有误导性,因为您只有一个 Employee 类,它同时是叶子和复合物,但没有说明一般情况。【参考方案2】:

我看到你从 wikipedia 中获取了类图,但遗憾的是它是错误的。这个是准确的,关于 GoF 书:

如您所见,ComponentComposite 之间的关联并不相同:

Composite 聚合 Components(例如,您可以将它们存储在列表中) Leaf没有孩子

另外,Composite 有一个方法 getChild(int n) 来获取第 n 个子组件(您可以简单地获取上一个列表的第 n 个元素)

要获取给定根组件的所有叶子,我想您可以使用其中一种Tree Traversal 算法。

【讨论】:

好的,但是 getChild 方法返回对象组合的第 n 个子元素,它不能是组件列表的第 n 个叶元素。 当然,这只是为了指出***没有我说的那么错误,但有点不精确......

以上是关于访问复合模式 Java 的叶子的主要内容,如果未能解决你的问题,请参考以下文章

在java里Composite是啥

Java 设计模式系列组合模式

java设计模式之组合模式

如何访问复合材料中的 jsf 复合材料的标记名?

Java 设计模式之组合学习与掌握

Java 设计模式之组合学习与掌握