具有MVC模式的观察者/可观察对象

时间:2012-07-09 20:03:25

标签: java swing model-view-controller observer-pattern

我遇到这种情况:

一个可观察的对象,另一个是观察者的对象。

观察者有一个方法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) 
    {

    }
}

但我不知道这是否是正确的实施方式!

3 个答案:

答案 0 :(得分:6)

Observer PatternMVC 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和 策略设计模式。