当前位置: 首页 > 知识库问答 >
问题:

OOP观察者模式:从主题外部调用notifyListener

通奕
2023-03-14

Observer对象在更改observable的某些字段后调用NotifyListeners()可以吗?会产生什么不利因素?通常是受试者的责任通知监听者的变化。

在将模型类包装到可观察/主题中时,我经常遇到以下问题,例如,使它们在UI中可访问。

当模型对象的任何字段发生更改时,我的subject是否应该通知它的侦听器,或者我是否应该提供某种方法setModel()来将新的模型对象作为参数,然后才通知所有侦听器?

例如:

class MyData {
  String myString;
  int myInt;
}

class MyDataObservable {
  private MyData data;

  // constructor

  void setString(String string) {
    data.myString = string;
    notifyListeners();
  }

  void setInt(int num) {
    data.myInt = num; 
    notifyListeners();
  }

  void notifyListeners() {...}

  void addListener(Observer o) {...}
}

我不喜欢我的主题基本上反映了我的模型的所有属性。这很难看。

class MyDataObservable {
  private MyData data;

  // constructor

  void setData(MyData data) {
    this.data = data; 
    notifyListeners();
  }

  void notifyListeners() {...}

  void addListener(Observer o) {...}
}

这种方法的缺点是,每次发生任何变化时,我都必须构建数据类的一个新副本,即使它只是模型类上的一个bool标志。

编辑

目前,使我的数据类成为一个可观察的不是一个选项,因为我使用的框架提供了一个可观察的机制,它也可以保存业务逻辑。由于这个原因,我想将我的数据类和逻辑/可观察的解耦。

共有1个答案

姬寂离
2023-03-14

在本例中,我将使用继承而不是组合:mydata是-aobservable而不是observable是-amydata

class Observable {
    Collection<Listener> listeners

    void addListener(Listener l) {...}
    void notifyListeners() {...}
}
class MyData extends Observable {
    String myString;
    int myInt;

    void setString(String string) {
        this.myString = string;
        notifyListeners();
    }

    void setInt(int num) {
        this.myInt = num; 
        notifyListeners();
    }
}
 类似资料:
  • 我试图用制作一个简单的马里奥游戏。因此,我需要一个,用于杀死(Mario中的主要敌人)。经过一番研究之后,我研究了 我还创建了一个 我相信(不确定我是否完全理解了这一点)这使得成为,并且我需要多个,这意味着我将有多个的 所以我有两个问题:我对有什么不了解,以及如何让多个()在死亡时调用

  • 主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知

  • 观察者模式 亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象: ​ 顾客和 商店 。 顾客对某个特定品牌的产品非常感兴趣 (例如最新型号的 iPhone 手机), 而该产品很快将会在商店里出售。 顾客

  • 一、定义 观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)

  • 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 定义一个目标构造函数,并实现绑定、解绑和触发等方法: function Subject() { this.events = {}; this.count = 0; }​ Subj