【问题标题】:Observer/observable objects with MVC pattern具有 MVC 模式的观察者/可观察对象
【发布时间】:2012-07-09 06:37:32
【问题描述】:

我有这种情况:

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

观察者有一个方法update(Observable obs,Object obj),它通过notifyObservers接收改变的对象。当观察者收到通知时,更新方法打印改变的对象。我想在实现 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) 
    {

    }
}

但我不知道这是否是一个正确的实现!

【问题讨论】:

  • MVC 和“观察者”似乎彼此不兼容。您可能正在寻找 MVVM 或 MVP。

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


【解决方案1】:

Observer PatternMVC Pattern 是两种不同的设计模式 - 只是为了确保我们在同一页面上。

在 MVC(至少按照定义)模式中,视图应该在模型更改时自动更新,我猜这就是您想要做的。在这种情况下,这意味着您的 Observer 应该是 View,而不是 Controller,而您的 Model 将是您的 Observable 对象。

因此:

Observable changes --> update Observer

将在某种程度上复制您在纯 MVC 模式中尝试获得的内容:

Model changes --> update View

我并不是说这应该是做事的方式,但我认为如果您尝试将 Java 的 Observer/Observable 应用于 MVC 模式,这可能会继续进行。

【讨论】:

  • 好的,所以我的可观察对象变成了 mvc 模式中的模型,视图是观察者。对吗?但在这种情况下,谁是控制器?
  • 这个example,使用了ObserverObservable,展示了两种模式之间的关系。
  • Controller 位于中间,因此如果 View 发生任何动作,则需要调用控制器。然后控制器决定做什么(例如,应用业务逻辑,做其他时髦的事情,并可能更新模型)
  • 但是我的应用程序非常简单......它不接收来自用户的任何输入,而只接收来自可观察对象的输入,那么拥有一个控制器是否有意义?
  • 因此,如果它非常简单,可能是您根本不想应用 MVC 模式,而只做其中的 Observable/Observer 部分。有时设计模式实际上可能有点矫枉过正。
【解决方案2】:

观察者模式是 MVC 的一部分。它是 MVC 的一个组成部分。

观察者模式也是熟悉的一个关键部分 模型-视图-控制器(MVC)架构模式。来源:https://en.wikipedia.org/wiki/Observer_pattern

MVC 模式可以看作是这三种设计模式的组合:观察者模式、组合模式和策略模式。这意味着 Observer 和 MVC 兼容的。

【讨论】:

    【解决方案3】:

    在“设计模式 - 可重用设计的元素”一书(臭名昭著的四人帮)第 1.2 节(SmallTalk MVC 中的设计模式)中,它在几个地方提到了 MVC 如何使用观察者模式,我在下面引用:

    从表面上看,这个例子反映了一种分离的设计 模型的视图。但该设计适用于更一般的 问题:解耦对象,以便对一个对象的更改可以影响任何对象 其他人的数量,而不需要更改的对象知道 其他人的详细资料。这种更通用的设计由 观察者设计模式

    稍后在同一部分中

    但是 MVC 中主要的关系是 Observer、Composite 和 策略设计模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 2016-08-26
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多