OOP类是一个Observable和Observer

时间:2014-03-04 12:06:52

标签: java oop design-patterns

我遇到一个问题,即我有一个班级Item,其中有Subitem个列表。当一个子项被更改或删除时,我需要父项知道它。

我在想,观察者模式在这里会派上用场。但是,对于扩展Observerable并实现Observer的Item类,它是否有意义?

干杯。

4 个答案:

答案 0 :(得分:2)

是的,有时候观察者也会被观察到。

问问自己为什么要应用这种模式。与直接更新相比,观察仅提供更新可能更复杂,例如,孩子在更新时调用他的父母。

通常,Observable s不想知道有关Observer s(解耦,信息隐藏)的详细信息,这样您几乎可以将任何课程设为Observer。如果这是你需要的,那么这种模式对你有好处。如果没有,那么添加它可能会导致不必要的复杂性(更难理解和调试代码)。

编辑(我倒退了):您的孩子(Observable)项目是否已经知道有关其父母(观察员)的所有详细信息?如果他们这样做,那么使用Observer可能会过度设计。如果孩子不想知道他们父母的详细信息,那么Observer可能会有用。

在观察观察者时,请注意周期https://stackoverflow.com/a/964820/1168342

答案 1 :(得分:1)

使用观察者设计模式,你的论证和情况是有意义的。关于Oberver design pattern.有一篇非常简单的文章。在java中也有一个非常简单的例子,所以没有必要在这里粘贴它。请看一下。

答案 2 :(得分:0)

最简单的答案是当您发现事件在两个方向都有流动时,很可能是时候引入Mediator了。有时这些对象是协调者。大多数人认为MVC中的Controller是一个中介。

另一种方法是创建一个对等协议,它可能不那么结构化,而且更具弹性,因为你可以做一些通常不属于Mediator的发现,因为它知道它提前协调的各方。

所以我的答案就是让每件事物都能观察到生态系统中其他事物的各个方面,除非采用某种通信协议,否则会很快导致混乱。

答案 3 :(得分:0)

如果您需要向项目添加子项目或从项目中删除子项目,则必须在该项目实例上调用方法。方法可能如下:

public void addToSubitems(Subitem subitem);
public void removeFromSubitems(Subitem subitem);

因此该项目负责管理其子项目。从项目返回子项目集合时,始终返回不可修改的集合。通过让Item类负责管理项目,它可以对添加,删除等采取措施。

如果项目还需要获得有关其子项更改的通知,您还可以考虑使子项不可变并将更改实现为项子项的原子替换。或者,只要将项目添加到该项目,该项目就会将观察者附加到子项目。