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

时间:2012-08-14 13:38:21

标签: design-patterns

我正试图绕过观察者模式,从概念上讲 - 我明白了,它似乎真的对许多东西有益......

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

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

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

如果我有2个观察者 - 一个'日志'对象,并且UI对象与用户名绑定...显然,日志记录对象将想知道任何数据更改,而UI对象可能只关心用户名

如何处理这些多个数据点 - 您希望(希望)不会编写代码来单独更新EACH数据点 - 并注册“监视”每个数据点!那将是荒谬的。

为了论证 - 假设用户的'属性'是100个数据点 - (第一个,中间,最后,dob,用户名,电子邮件,密码,lastlogin等......)和“updateUser”方法触发 - 改变只有lastlogin ...'通知'是否处理决定不警告UI的条件逻辑 - 或者是UI警告(因为它是'用户'的观察者 - 并且UI对象有一个处理通知的方法,并且IT做条件逻辑来决定'lastlogin'不感兴趣。????

1 个答案:

答案 0 :(得分:3)

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

 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中执行此操作,但为了说明这一点,这里是长版本。)

 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()调用的污染。