通知一个类另一个类的更改
Notifying a class of another class' changes
具有类Container
、Item
和Property
,每当项中的属性发生更改时,都应通知容器。
容器是项目的所有者,需要根据其属性正确管理这些项目的信息。
我已经想到了两种选择:
- 观察者模式
- 代理对象
在我看来,观察者模式对于这项任务来说似乎太重了。代理对象可以很好地工作,但在这种情况下,我会违反DRY原则,因为我必须将调用从代理转发到实际对象。
一个要求是对用户隐藏细节。要求不需要调用某些update_item()
函数或类似函数,即将通知容器的责任交给用户,这可能会导致使用问题。
在这种简单的情况下,我看不出使用Observer
的原因。由于Item
一次只能在一个容器中,我只想给Item
一个指向它所在容器的引用或指针
当Item
的某个Property
改变时,它能够通过该指针通知它的Container
Observer
模式在需要通知许多对象的情况下非常有用。
编辑
使用接口和极其干净的设计做每一件简单的事情也可能会对你造成伤害。我认为zen of Python
的引用很好地解释了我的意思:
Special cases aren't special enough to break the rules. //make Interfaces
Although practicality beats purity. //but not everywhere
所以你应该在纯度和实用性之间取得平衡
您应该使用最容易理解和维护的模式,并且最少需要专门组件的发明。在我工作的环境(objective-C)中,观察者模式是最简单的。当您的通知要求发生变化时,它还提供了灵活性。
Andrew的答案是事件更简单——对象之间的直接通信不需要发明代理或通知处理的开销。但是,如果您将来需要它,它的灵活性会降低。
我不知道"太重"是什么意思。也许你可以解释一下。
正如前面所提到的,Observer在这里的功能相当夸张,但解决方案非常简单。你只需要把这件事搞得一团糟。
- 当属性发生更改时,它会通知其父项
- 当一个项发生更改(属性更改的副作用,或该项更为完整的东西)时,它会通知它的容器/父项
- 当一个容器被通知时,好吧,你就完了。如果容器可以嵌套,那么如果必要的话,我想它可以向其父容器引发一个事件
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C ++读取用户输入的字符一个一个符号
- 循环速度要比一个一个一个一个
- 计算一个*一个没有溢出的模数n