假设我有一个“拥有”零个或多个分支的类树,并且每个分支“具有”零个或多个水果等。
假设我想创建一个对象,允许您将所有数据视为单个对象,因此我的界面用户不会说“树,遍历所有分支。对于每个分支,添加总共有多少水果。“但是只会说“树,你有多少水果?”或者“你有多少苹果?”
这是什么类型的对象?什么设计模式适用?
答案 0 :(得分:5)
听起来像访客模式 - 请参阅http://en.wikipedia.org/wiki/Visitor_pattern。
在维基百科文章中,他们举了一个由Car元素组成的Car的例子。有一个基类CarElementVisitor。元素和基本访问者类合作以允许通过树进行迭代。
在你的情况下,你可能有一个基类TreeElementVisitor,它知道如何浏览树,水果等。
"Tree, how many fruit do you have?"
要解决此问题,您需要创建一个名为FruitCountingVisitor的TreeElementVisitor子类,它将运行计数保留为成员变量。所有visitFruit
方法都会递增计数器。其他方法(例如visitTree
,visitBranch
等不执行任何操作。
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
另见: