design-patterns - 观察者模式 - 单一数据点与大数据集

标签 design-patterns

我正在尝试了解观察者模式,从概念上讲 - 我明白了,它似乎对很多东西确实有益......

但是......在我正在做的所有示例和阅读中 - 似乎所有示例都使用“单个”数据点和单个类来管理该数据点,所以当然如果“x”发生变化,通知其他一些(注册的)类...

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

以 USER 对象为例,它具有一些普通的 CRUD 方法,“插入”、“更新”、“删除”...每个方法都会“更改”数据。

如果我有 2 个观察者 - 一个“日志记录”对象和一个与用户名相关的 UI 对象...显然,日志记录对象会想要了解任何数据更改,而 UI 对象可能只关心用户名.

如何处理这些多个数据点 - 您(希望)不会编写代码来单独更新每个数据点 - 并注册以“观看”每个数据点!那太荒谬了。

为了论证 - 假设用户的“属性”是 100 个数据点 - (第一个、中间、最后一个、出生日期、用户名、电子邮件、密码、最后登录等...)并且触发“updateUser”方法 - 更改只有最后登录...“通知”处理决定不提醒 UI 的条件逻辑 - 或者 UI 是否被提醒(因为它是“用户”的观察者 - 并且 UI 对象有一个处理通知的方法,并且IT 执行条件逻辑来决定“laSTLogin”不感兴趣。???

最佳答案

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

 private Observer[] updateObservers;
 private Observer[] usernameUpdateObservers;

当观察者注册自己时,它必须知道将自己放入哪个组。然后您的 User 类将通知相应的组;

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

  public void setEmail(String email) {
    this.email = email;
    notify(updateObservers);
  }

但是,当您观察对象的每个 Action 时,代理可能更合适。我将给您一个小小的 Java 示例(现在有多种方法可以在 Java 中动态执行此操作,但为了说明这一点,这里是长版本)。

 public interface User {
   void setUsername(String username);
   void setEmail(String email);
 }

 public class LoggingUserProxy implements User {
   private User user;

   public LoggingUserProxy(User user) { this.user = user; }

   public void setUsername(String username) {
     user.setUsername(username);
     log("updated username to " + username);
   }

   public void setEmail(String email) {
     user.setEmail(email);
     log("updated emailto " + email);
   }

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

   User user = new LoggingUserProxy(realUser);

接口(interface)没有改变,你的 User 对象没有被所有的notify()调用污染。

关于design-patterns - 观察者模式 - 单一数据点与大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11953522/

相关文章:

model-view-controller - 观察者、发布/订阅和数据绑定(bind)之间的区别

ios - 获取 3 个有序值的数组,同时支持指定值

java - 设计问题: Dynamically changing GUI -> sending implementation classes as soap attachments

java - 我们可以从 xml 文件创建一个类吗?

design-patterns - 有谁知道黑板模式的成功实现?

javascript - 如何在客户端实现服务器更新监听器

oop - OOP 中的适配器模式与依赖注入(inject)有什么区别?

java - 如何实现通用分页

design-patterns - 全局常量是反模式吗?

node.js - 如何判断异步调用是否是最后一次