将主体映射到观察者 - 观察者模式 GoF 书籍

Xty*_*83a 2 design-patterns observers observer-pattern

在GoF设计模式一书中,谈到观察者模式的实现部分时,有这样的规定:

将主题映射到其观察者 主题跟踪它应通知的观察者的最简单方法是在主题中显式存储对它们的引用。然而,当主体较多而观察者较少时,这种存储可能过于昂贵。一种解决方案是通过使用关联查找(例如哈希表)来以空间换取时间来维护主体到观察者的映射。因此,没有观察者的主题不会产生存储开销。另一方面,这种方法增加了接触观察者的成本。

我不明白使用哈希表如何提高存储容量。在 Java 中,对于每个主题,我们都可以有一个观察者列表List<Observer>。如果没有观察者附加到该主题,则列表引用将为空。如果我们使用哈希表,Map<Subject, List<Observer>我们仍然有列表,但我们也有对主题的引用,所以这种方式的内存效率有点低。不知道是否相关,Gof书中实现的语言是Smalltalk和C++。

jac*_*646 5

引用的要点似乎是,如果主体负责存储自己的观察者,那么在大多数主体在给定时间未被观察到的情况下,每个主体都要承担存储空列表的成本(想象一下数百万个主体)。

另一方面,如果主体到观察者的映射集中到单个 中Map,则只有(少数)被观察的主体具有任何内存占用。正确地指出,由于需要存储对主题的引用,因此集中映射每个观察对象的内存成本更高,这就是为什么这样的设计仅在“当对象很多而观察者很少时”才有意义。 。

请注意优化代码以避免空集合的更现代的示例:为什么要重载 Java Stream 接口中的 varargs 方法 of()?