java.util.Observer
和java.util.Observable
很难看。它们需要类型转换,这会让类型安全爱好者感到不舒服,而且如果没有丑陋的类型转换,就不能将一个类定义为多个对象的Observer
。事实上,在"How do I know the generic object that the Observer class sends in Java?“中,an answerer says认为每个观察者/被观察者只应使用一种类型的数据。
我正在尝试用Java创建观察者模式的通用版本,以解决这两个问题。这与前面提到的帖子中的问题没有什么不同,但这个问题并没有得到明显的解决(最后一个评论是来自OP的一个未回答的问题)。
发布于 2012-11-13 22:37:13
Observer.java
package util;
public interface Observer<ObservedType> {
public void update(Observable<ObservedType> object, ObservedType data);
}
Observable.java
package util;
import java.util.LinkedList;
import java.util.List;
public class Observable<ObservedType> {
private List<Observer<ObservedType>> _observers =
new LinkedList<Observer<ObservedType>>();
public void addObserver(Observer<ObservedType> obs) {
if (obs == null) {
throw new IllegalArgumentException("Tried
to add a null observer");
}
if (_observers.contains(obs)) {
return;
}
_observers.add(obs);
}
public void notifyObservers(ObservedType data) {
for (Observer<ObservedType> obs : _observers) {
obs.update(this, data);
}
}
}
希望这能对某些人有用。
发布于 2013-07-26 06:58:52
我曾经使用dynamic proxies为Java编写了一个观察者模式的通用实现。下面是一个如何使用它的示例:
Gru gru = new Gru();
Minion fred = new Minion();
fred.addObserver(gru);
fred.moo();
public interface IMinionListener
{
public void laughing(Minion minion);
}
public class Minion extends AbstractObservable<IMinionListener>
{
public void moo()
{
getEventDispatcher().laughing(this);
}
}
public class Gru implements IMinionListener
{
public void punch(Minion minion) { ... }
public void laughing(Minion minion)
{
punch(minion);
}
}
full source code of AbstractObservable is available on pastebin。回到I blogged about how it works in a bit more detail,也指的是相关的项目。
Jaana wrote an interesting summary of different approaches,还将动态代理方法与其他方法进行了对比。当然,非常感谢to Allain Lalonde from which I got the original idea。我还没有签出PerfectJPattern,但它可能只包含a stable implementation of the observer pattern;至少它看起来像是一个成熟的库。
发布于 2014-03-27 16:54:39
尝试使用芭乐的EventBus类。
你可以像这样声明一个观察者:
public class EventObserver {
@Subscribe
public void onMessage(Message message) {
...
}
}
新的EventBus如下所示:
EventBus eventBus = new EventBus();
并像这样注册观察者:
eventBus.register(new EventObserver());
最后通知观察者,如下所示:
eventBus.post(message);
https://stackoverflow.com/questions/13362636
复制相似问题