Design patterns 观察者模式-奇异数据点与大型集合

Design patterns 观察者模式-奇异数据点与大型集合,design-patterns,Design Patterns,我试图了解观察者模式,从概念上讲,我明白了,它似乎对很多东西都非常有益 然而。。。在我正在做的所有示例和阅读中,似乎所有示例都使用一个“单一”数据点和一个类来管理该数据点,因此,如果“x”发生更改,请通知其他(已注册)类 当一个类中有多个方法可能更改多个数据点时,该怎么办“观察者”应该注册特定的“方法”吗?还是添加“onchange”方法 以一个用户对象为例,使用一些普通的CRUD方法,“插入”、“更新”、“删除”。。。每种方法都会“改变”数据 如果我有两个观察者-一个“日志”对象,一个UI对象

我试图了解观察者模式,从概念上讲,我明白了,它似乎对很多东西都非常有益

然而。。。在我正在做的所有示例和阅读中,似乎所有示例都使用一个“单一”数据点和一个类来管理该数据点,因此,如果“x”发生更改,请通知其他(已注册)类

当一个类中有多个方法可能更改多个数据点时,该怎么办“观察者”应该注册特定的“方法”吗?还是添加“onchange”方法

以一个用户对象为例,使用一些普通的CRUD方法,“插入”、“更新”、“删除”。。。每种方法都会“改变”数据

如果我有两个观察者-一个“日志”对象,一个UI对象与用户名关联。。。显然,日志记录对象希望了解任何数据的更改,而UI对象可能只关心用户名

如何处理这些多个数据点-您(希望)不会编写代码来分别更新每个数据点-并注册到“监视”每个数据点!!!那太荒谬了


为了参数起见-假设用户的“属性”是100个数据点-(第一、中间、最后、dob、用户名、电子邮件、密码、lastlogin等),并触发一个“updateUser”方法-仅更改lastlogin。。。“通知”是否处理决定不向UI发出警报的条件逻辑?或者UI是否已发出警报(因为它是“用户”的观察者,并且UI对象有一个处理通知的方法,并且它执行条件逻辑来确定“lastlogin”对它不感兴趣。)??

您不必为每个方法注册观察者。您可以对观察者进行分类,例如:

 private Observer[] updateObservers;
 private Observer[] usernameUpdateObservers;
当观察者注册自己时,它必须知道将自己放入哪个组中。然后,您的用户类将通知相应的组

  public void setUsername(String username) {
    this.username = username;
    notify(updateObservers);
    notify(usernameUpdateObservers);
  }

  public void setEmail(String email) {
    this.email = email;
    notify(updateObservers);
  }
但是,当您观察对象的每个动作时,代理可能更合适。我将给您一个小java示例(现在有一些方法可以在java中动态执行此操作,但为了说明这一点,这里有一个长版本)

现在,当我创建我的用户时,我将其包装在代理中

   User user = new LoggingUserProxy(realUser);
该接口保持不变,并且用户对象不会被所有notify()调用污染

   User user = new LoggingUserProxy(realUser);