什么类的类/对象使用有关几个对象的信息来表示更大的系统?

时间:2012-10-23 00:39:30

标签: java design-patterns

假设我有一个“拥有”零个或多个分支的类树,并且每个分支“具有”零个或多个水果等。

假设我想创建一个对象,允许您将所有数据视为单个对象,因此我的界面用户不会说“树,遍历所有分支。对于每个分支,添加总共有多少水果。“但是只会说“树,你有多少水果?”或者“你有多少苹果?”

这是什么类型的对象?什么设计模式适用?

3 个答案:

答案 0 :(得分: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,根据构造函数参数过滤特定的水果。

答案 1 :(得分:2)

这正是Composite模式:

  

将对象组合成树结构以表示部分整体   层次结构。 Composite允许客户处理单个对象和   物体成分均匀。

顺便说一句,使用Composite模式可以让您轻松使用Visitor来操作树的节点。

答案 2 :(得分:1)

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

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

另见:

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