2

Let's say I have a class Tree that "has" zero or more Branches, and each Branch "has" zero or more Fruit, etc.

Let's say I want to create one object that allows you to treat all of that data as a single object, so a user of my interface wouldn't say "Tree, iterate through all of your branches. For each branch, add how many fruit there are to a total." but instead would just say "Tree, how many fruit do you have?" or "How many Apples do you have?"

What kind of object is this? What design pattern is applicable?

4

3 回答 3

5

对我来说听起来像是访客模式 - 请参阅http://en.wikipedia.org/wiki/Visitor_pattern

在维基百科文章中,他们给出了一个由 Car 元素组成的 Car 的示例。有一个基类 CarElementVisitor。元素和基本访问者类协作以允许通过树进行迭代。

在您的情况下,您可能有一个基类 TreeElementVisitor,它知道如何在树、水果等中导航。

"Tree, how many fruit do you have?" 

为了解决这个问题,您创建了一个名为 FruitCountingVisitor 的 TreeElementVisitor 子类,它将运行计数作为成员变量。所有visitFruit方法都会增加计数器。其他方法,如等visitTreevisitBranch什么都不做。

Tree tree = // create a tree
FruitCountingVisitor visitor = // create the visitor
tree.accept(visitor);
System.out.println(visitor.getCount());

然后,您可以创建一个 AppleCountingVisitor - 或者泛化 FruitCountingVisitor 以根据构造函数参数过滤特定的水果。

于 2012-10-23T00:55:41.923 回答
2

这正是复合模式:

将对象组合成树结构以表示部分整体的层次结构。Composite 让客户可以统一处理单个对象和对象的组合。

顺便说一句,复合模式的使用确实允许您轻松地使用访问者对树的节点进行操作。

于 2012-10-23T11:57:02.720 回答
1

您可能也对非 Java 特定的解决方案感到好奇,在这种情况下,我认为您可以使用fold。Wikipedia 描述了一种非常通用的方法来迭代树状结构并从该迭代中生成某种类型的结果:

http://en.wikipedia.org/wiki/Catamorphism#Example

另见:

http://en.wikipedia.org/wiki/Fold_(higher-order_function )

于 2012-10-23T01:05:56.813 回答