2

我试图了解观察者模式,并且从概念上讲 - 我明白了,它似乎对很多东西真的有益......

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

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

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

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

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

为了争论 - 假设用户的“属性”是100个数据点 - (第一,中间,最后,dob,用户名,电子邮件,密码,lastlogin等......)并且“updateUser”方法触发 - 仅更改lastlogin ...“通知”是否处理决定不提醒 UI 的条件逻辑 - 或者 UI 是否被提醒(因为它是“用户”的观察者 - 并且 UI 对象具有处理通知的方法,而 IT 负责判断“lastlogin”对它不感兴趣的条件逻辑。????

4

1 回答 1

3

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

 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);
  }

但是,当您观察对象的每个动作时,代理可能更合适。我会给你一个小的 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);

接口未更改,并且您的 User 对象不会被所有 notify() 调用污染。

于 2012-08-14T16:22:30.107 回答