如何面对包含可观察字段的可观察对象

时间:2010-06-08 10:54:59

标签: java model-view-controller design-patterns observer-pattern

我需要一个关于MVC和Observer-Pattern的提示。

例如,模型包含“Address”和“Person”类。 Address类包含字段street:String,zipcode:String,location:String。而Person类包含字段name:String,firstName:String,address:Address。

到目前为止我的方法看起来像这样: 地址和人都是可观察的。如果正在调用其中一个setter,我将验证当前值和新值是否不同。仅在这种情况下才会触发更新事件。该事件包含源,已更改字段的名称,旧值和新值。

视图的类包含用于显示和编辑人员信息的文本字段:名称,名字,街道,邮政编码,位置。它知道Person模型,并且是该人的订阅观察者。因此它从person对象获取更新事件。

我的问题涉及人类中地址类型的地址字段,因为地址本身是可观察的。 如果视图在设置新地址时从人那里获得更新事件,我可以更新视图中的所有地址相关字段。 但是,如果地址字段发生变化怎么办?视图是否还要从地址注册更新事件?

任何有关常见设计方法的提示都将受到赞赏。 问候。

2 个答案:

答案 0 :(得分:1)

IMO视图可以作为观察者注册到任意数量的模型对象。我一般不知道任何理由,为什么观察者应该只限于观察一个Observable。

我看到的唯一问题是,由于Observer只能实现一次接口,因此不同的observable会使用相同的通知方法,这会使处理更加尴尬。

此外,如果一个Observable是另一个Observable的成员,更新Observer注册的逻辑会变得有点棘手。

答案 1 :(得分:0)

我经常使用JFace数据绑定,他们这样做:

您可以在模型元素和GUI元素之间创建绑定。为了简单起见,我们在模型中使用String字段创建绑定到GUI上的Text对象(Textfield)。因此,只要模型中的值发生更改,就会触发事件,可以验证并转换该值,并通知Text小部件。绑定在另一个方向上执行相同的操作:在GUI上的每次编辑中,如果需要捕获事件,则会触发事件,验证并转换为可观察的模型字段。

因此典型的情况是模型字段和编辑器组件之间存在1:1的关系。