我遇到这种情况:
一个可观察的对象,另一个是观察者的对象。
观察者有一个方法update(Observable obs,Object obj)
通过notifyObservers
接收更改的对象。当观察者收到通知时,update方法打印更改的对象。我希望在实现MVC模式的gui中打印出结果。我遵循本指南MVC pattern。
我的想法是让Controller
成为观察者。类似的东西:
public class Controller extends AbstractController implements Observer
{
public static final String TOTAL_HIT_COUNT_PROPERTY = "Total Hit";
public void changeTotalHitCount(long new_total_hit_count)
{
setModelProperty(TOTAL_HIT_COUNT_PROPERTY, new_total_hit_count);
}
@Override
public void update(Observable o, Object arg)
{
}
}
但我不知道这是否是正确的实施方式!
答案 0 :(得分:6)
Observer Pattern和MVC Pattern是两种不同的设计模式 - 只是为了确保我们在同一页面上。
在MVC(至少按定义)模式中,View应该在模型更改时自动更新,我猜这是你要做的。在这种情况下,这意味着你的Observer应该是View,而不是Controller,你的Model将是你的Observable对象。
因此:
Observable changes --> update Observer
会复制你想要在纯MVC模式中获得的内容:
Model changes --> update View
我并不是说这应该是做事的方式,但我想如果你试图将Java的Observer / Observable应用于MVC模式,那么这可能会继续下去。
答案 1 :(得分:2)
观察者模式是MVC的一部分。它是MVC不可分割的一部分。
观察者模式也是熟悉的关键部分 模型 - 视图 - 控制器(MVC)架构模式。资料来源:https://en.wikipedia.org/wiki/Observer_pattern
MVC模式可以看作是这三种设计模式的组合:Observer,Composite和Strategy Patterns。这意味着Observer和MVC 兼容。
答案 2 :(得分:0)
在“Design Patterns - Elements of Reusable Design”(臭名昭著的四人帮)一书中,第 1.2 节(SmallTalk MVC 中的设计模式)在几个地方提到了 MVC 如何使用观察者模式,我在下面引用:
<块引用>从表面上看,这个例子反映了一种解耦的设计 来自模型的意见。但该设计适用于更通用的 问题:解耦对象,以便对一个对象的更改可以影响任何对象 不需要改变的对象知道的其他数量 其他人的细节。这种更通用的设计由 观察者设计模式
稍后在同一部分
<块引用>但是MVC中的主要关系由Observer、Composite和 策略设计模式。