Design patterns 允许对象在层次结构中找到根的正确设计模式是什么?
我有一个对象的层次结构(比如说,3层) A类由B类组成,B类由C类组成 初始化执行如下操作: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时,就会出现我的问题。我目前知道实现这一目标的两种方法:
$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)存储到对象中,而不是指向对象的指针。我将依靠已知类上的方法按键查找对象,并将对象与键关联。这样可以防止整个子树被丢弃。好主意。。。我会调查的!您的类在任何方面都是相似的还是在概念上是不同的?概念上是不同的,比如客户、订单和订购的产品