2

我有一个对象的层次结构(比如说,3 个级别)。

A类与B类组成,B类与C类组成。

初始化执行如下操作:

$a1 = new A()
$a1->add('B1', $b11 = new B())
$a1->add('B2', $b12 = new B())
$b11->add('C1', $c111 = new C())
$b12->add('C1', $c121 = new C())
...

我的问题发生在$c121想要检索$c111. 我目前知道实现这一目标的两种方法:

1/ 假设 A 是一个单例:它使我能够从树的任何节点冲回根。然后我可以使用完整的“路径名”从根目录寻址任何节点。

2/ 给每个对象它的祖先,所以它们可以通过树来回(通过祖先引用)和来回(通过路径名)。

虽然两者都满足我的需求,但我找不到任何令人满意的解决方案。

我错过了什么吗?这应该是一个常见问题,但我无法弄清楚哪种设计模式可以匹配这个问题。

编辑请注意,层次结构不是由相似的项目组成的。所以它是一个固定的层次结构。只有每个级别的项目数量是波动的。(例如,客户、订单和订购的产品)

4

2 回答 2

1

如果您的课程是不同的,那么我会这样对待它们(即您本身没有树)。
似乎您正在尝试将不同的元素视为相似。

如果您需要访问包含类(您称为父类),需要提供参考。

在上面的示例中,我将为您的关联对象提供对“持有”它的对象的引用,并为 C 类提供获取其兄弟姐妹的方法。

$c121=new C(this);   // pass reference to container
$c121->getSiblings();  // method to get sibling through reference to containing object

另一种看待它的方法是:

$frank=new Customer()
$frank->add('Order01', $order1 = new Order())
$frank->add('Order02', $order2 = new Order())
$order1->add('LineItem01', $item1 = new LineItem())
$order1->add('LineItem02', $item2 = new LineItem())

$order1->getOrder() //return collection
$order1->getOrder()->getItems() //return collection items/siblings
于 2012-08-28T20:54:36.910 回答
0

两者都做。在 Eclipse 中,工具通常会在已知类上实现响应模型根的方法。出现在树中的对象(视觉上像树项或实现方式像 UI 小部件)都知道它们的父级,并且可以通过继承的 getParent() 调用检索父级。

于 2012-08-28T20:22:08.717 回答