gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:35:48 25 4
gpt4 key购买 nike

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

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

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

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

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

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

为了论证 - 假设用户的“属性”是 100 个数据点 -(first、middle、last、dob、username、email、password、laSTLogin 等...)和“updateUser”方法触发 - 仅更改 laSTLogin ...“通知”是否处理决定不向 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);

界面没有变化,您的 User 对象没有被所有的 notify() 调用污染。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com