我正在学习并尝试从这个教程中在Java中实现观察者模式。我卡在了一个问题上,就是关于我是否应该使用
在下面的实现中,
所以我的问题是,我是否应该使用
WeakReference
来让主题持有观察者。在下面的实现中,
Subject
和BinaryObserver
互相持有强引用,这让我担心防止GC回收未使用的Subject
。所以我的问题是,我是否应该使用
List<WeakReference<Observer>> observers
代替List<Observer> observers
?
Subject.java
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
Observer.java
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
BinaryObserver.java
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary String: " + Integer.toBinaryString());
}
}
ObserverPatternDemo.java
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
}
}
Subject
和Observer
都不是“可达”的(本质上是:没有办法从以main()
方法中的对象为起点的任何对象引用链中获取到它们),那么它们可以被收集。它并不关心它们彼此引用。这些引用仅确保如果一个是可达的,则另一个也是可达的。如果两个都不可达,它不会无谓地将它们保持活动状态。 - dcsohlWeakReference
)呢?我认为观察者模式是使用“弱引用”的一个很好的例子,因为在C++中,观察者模式对于“weak_ptr”有很好的示范作用... - hackjutsu