Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 允许对象在层次结构中找到根的正确设计模式是什么?_Design Patterns_Tree_Hierarchy - Fatal编程技术网

Design patterns 允许对象在层次结构中找到根的正确设计模式是什么?

Design patterns 允许对象在层次结构中找到根的正确设计模式是什么?,design-patterns,tree,hierarchy,Design Patterns,Tree,Hierarchy,我有一个对象的层次结构(比如说,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时,就会出现我的问题。我目前知道实现这一目标的两种方法:

我有一个对象的层次结构(比如说,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/为每个对象指定其祖先,以便它们可以在树中来回(通过祖先引用)和(通过路径名)

虽然两者都满足了我的需求,但我找不到任何一种能满足我需求的解决方案

我错过什么了吗?这应该是一个常见的问题,但我不知道什么设计模式可以匹配这个问题


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

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

如果您的类是不同的,那么我会将它们视为不同的类(即您本身没有树)。
似乎您试图将不同的元素视为相似的元素

如果您需要访问包含类(您称之为父类),则需要提供引用

在上面的示例中,我将为关联对象提供一个对“持有”它的对象的引用,并为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

我有一个相当。。。家长参考解决方案的实用性问题。当我转储一个对象时,它会在链中转储所有相关对象,因此任何叶子转储都会为我提供整个树。所以你的建议是,我不应该考虑这个问题。为了处理这个问题,我会把一个键(string / char []或int)存储到对象中,而不是指向对象的指针。我将依靠已知类上的方法按键查找对象,并将对象与键关联。这样可以防止整个子树被丢弃。好主意。。。我会调查的!您的类在任何方面都是相似的还是在概念上是不同的?概念上是不同的,比如客户、订单和订购的产品