假设某个View感兴趣的模型中有5个或6个变量,您是否为每个变量编写了不同的函数,例如

int a;
int b;
int c;

void setA( newA ) {
   a = newA;
   notifyAObservers();
}

void setB( newB ) {
   b = newB;
   notifyBObservers();
}

void setC( newC ) {
   b = newC;
   notifyCObservers();
}

或者你只有一个通知方法并浪费一点CPU时间

ie而不是notifyAObservers和notifyBObservers,你只需要notifyObservers

#1楼 票数:6 已采纳

我相信传统的方法是通知所有观察者,让他们处理它。 这是因为您不知道哪些观察者正在观察哪个变量 - 您只知道他们希望在出现变化时收到通知。 但是,如果您确实知道观察者正在观察哪些变量,并且性能至关重要,那么您可能会做出类似于您拥有的内容。

在传统的Observer模式中,Observers实现了一个update()方法,当发生更改时,控制器会调用该方法。 Observables(数据模型)将有一个notifyObservers()方法,它迭代Observers并调用它们的update()方法。 然后,观察者得到他们需要的任何东西,视图更新。

但是,只要我实现了Observer模式,我只需保留一个观察者列表并通知所有人。 这样,我只有一个观察者列表,其余的类以及不同的观察者都可以改变,而不会对可观察的类通知进行任何更改。

#2楼 票数:0

编辑:几年前我写了我的答案。 刚读完之后,我觉得我需要更新它。

我认为最好的方法是通知所有观察者并让观点决定他们是否需要自我更新。

每个视图都能够验证模型的状态并采取相应的行动。 另外,“args”可以用作标志来指示已经改变的内容(视图可能不希望每次改变都更新自己)。

这样,模型REALLY不知道视图的显示方式和内容,它们是分离的。

第一个实现看起来像这样:

public class MyModelV1 extends Observable {
    private int value;
    public void setValue(int value) {
        this.value = value;
        setChanged();
        notifyObservers();
    }
    public int getValue() {
        return value;
    }
}
public class MyViewV1 implements Observer {
    public void update(Observable o, Object arg) {
        if (o instanceof MyModelV1) {
            System.out.println(((MyModelV1) o).getValue());
        }
    }
}

视图只检查收到的可观察的类型。 但是,如果模型具有许多属性并触发许多不同场景的视图,则此简单检查可能会过于频繁地刷新视图。

另一种方法如下:

public class MyModelV2 extends Observable {
    private int value;
    public void setValue(int value) {
        this.value = value;
        setChanged();
        notifyObservers("value");
    }
    public int getValue() {
        return value;
    }
}
public class MyViewV2 implements Observer {
    public void update(Observable o, Object arg) {
        if (o instanceof MyModelV2 && "value".equals(arg)) {
            System.out.println(((MyModelV2) o).getValue());
        }
    }
}

这里,通知传递限定符,使视图更准确地决定何时刷新自身。 视图仍然需要检查并转换模型,因为没有保证arg“value”不会被另一个模型通知(并且转换会在运行时失败)。

我个人的最爱是这样的:

public class MyModelV3 extends Observable {
    private int value;
    public void setValue(int value) {
        this.value = value;
        setChanged();
        Notification.MY_MODEL_VALUE_UPDATED.notifyObserver(this);
    }
    public int getValue() {
        return value;
    }
}
public class MyViewV3 implements Observer {
    public void update(Observable o, Object arg) {
        if (Notification.MY_MODEL_VALUE_UPDATED.equals(arg)) {
            MyModelV3 model = Notification.MY_MODEL_VALUE_UPDATED.getModel(o);
            System.out.println(model.getValue());
        }
    }
}
public class Notification<T extends Observable> {
    public static final Notification<MyModelV3> MY_MODEL_VALUE_UPDATED = new Notification<MyModelV3>();
    private Notification() {
    }
    public T getModel(Observable o) {
        return (T) o;
    }
    public void notifyObserver(T observable){
        observable.notifyObservers(this);
    }
}

这里,通知发送一个强类型限定符,该限定符绑定到Model。 视图可以使用通知来检索强类型模型(而不是强制转换)。

这是在观察者和事件总线之间的某个地方。

  ask by DevDevDev translate from so

未解决问题?本站智能推荐:

2回复

可以从MVC中删除观察者模式吗?

我想知道是否可以从MVC中删除观察者模式(观察者从模型到视图的位置,通知模型中的任何更改并更新视图),如果我们将其删除,将会带来什么后果。
3回复

MVC与观察者模式

我最近在StackoverFlow上问了一个关于MVC的问题: 桌面应用程序开发中可以使用MVC设计模式/体系结构模式吗? 根据提供的答案,我开始研究如何在Windows窗体应用程序中实现该功能。 我遇到了以下CodeProject文章: http : //www.codeproject.
2回复

观察者模式与MVC[关闭]

我想知道观察者模式和MVC之间有什么区别。 我有一些在学校用Java编写MVC程序的经验,但没有使用观察者模式的经验。 (有人告诉我观察者模式意味着我在Java中使用了Observer类......我不认为这是一个很好的答案。) 感谢lottttt,请帮助我解决以下问题。 他们之间
2回复

MVC/观察者和不可变数据结构

在两种情况下,您能否解释一下MVC / Observer技术的类似物: 不可变对象(OOP样式) 不可变数据(功能样式) 例如,让我们考虑以下简单的GUI示例(您可以在这里试一试http://tinkerbin.com/0XDHRXIl点击“运行”按钮启动它并等待2秒钟以显示文本
3回复

如何在Delphi的MVC中避免循环通知?

我试图在一个小应用程序中使用模型 - 视图 - 控制器模式。 该模型包含一些数据和这样的选择 现在我有一个观察模型的树视图。 如果用户在树视图中选择项目,则模型选择应该更改。 问题是我遇到了循环更改通知的问题:我在树视图的OnChange事件中更改了模型选择。 这会导致树视图更新其
1回复

观察者模式vs事件总线消息方法

我一直在密切关注 MVC 实现和事件总线。 为什么不使用 Event-bus 而不是 Observer Pattern 来实现 MVC 应用程序? 例如,假设我有两个类Model和View ,在典型的观察者模式中,它将是: 相反,使用绿色机器人事件总线或任何其他事件总线的方法有什么好处/缺点? 它会
3回复

在MVC中,为什么模型应该通知视图,为什么视图应该具有模型?

在我的世界中,模型仅通知订阅该模型事件的控制器。 然后,控制器告诉视图该怎么做,例如将新行添加到列表中。 与视图相同:视图通知控制器已订阅该视图的事件。 然后,控制器根据需要修改模型,例如设置人的名字,并在模型上调用Save()方法。 好的,我知道我错了,我不认为每一篇有关MVC的文
7回复

MVC的最佳定义是什么?

我一直在使用带有 MVC 配置的 Zend 框架,阅读了有关 Ruby on Rails 的信息,并且我计划在 Python(Django?)中探索其他 MVC 框架。 我真的很喜欢它隔离逻辑、安全性和验证的某些部分的方式。 但是在使用它一年后,我在这里读到一个答案,说几乎每个人对 MVC 的定义都