首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的通用观察者模式

Java中的通用观察者模式
EN

Stack Overflow用户
提问于 2012-11-13 22:37:13
回答 4查看 13.3K关注 0票数 24

java.util.Observerjava.util.Observable很难看。它们需要类型转换,这会让类型安全爱好者感到不舒服,而且如果没有丑陋的类型转换,就不能将一个类定义为多个对象的Observer。事实上,在"How do I know the generic object that the Observer class sends in Java?“中,an answerer says认为每个观察者/被观察者只应使用一种类型的数据。

我正在尝试用Java创建观察者模式的通用版本,以解决这两个问题。这与前面提到的帖子中的问题没有什么不同,但这个问题并没有得到明显的解决(最后一个评论是来自OP的一个未回答的问题)。

EN

回答 4

Stack Overflow用户

发布于 2012-11-13 22:37:13

Observer.java

代码语言:javascript
复制
package util;

public interface Observer<ObservedType> {
    public void update(Observable<ObservedType> object, ObservedType data);
}

Observable.java

代码语言:javascript
复制
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);
        }
    }
}

希望这能对某些人有用。

票数 16
EN

Stack Overflow用户

发布于 2013-07-26 06:58:52

我曾经使用dynamic proxies为Java编写了一个观察者模式的通用实现。下面是一个如何使用它的示例:

代码语言:javascript
复制
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;至少它看起来像是一个成熟的库。

票数 3
EN

Stack Overflow用户

发布于 2014-03-27 16:54:39

尝试使用芭乐的EventBus类。

你可以像这样声明一个观察者:

代码语言:javascript
复制
    public class EventObserver {
        @Subscribe 
        public void onMessage(Message message) {
            ...
        }
    }

新的EventBus如下所示:

代码语言:javascript
复制
EventBus eventBus = new EventBus();

并像这样注册观察者:

代码语言:javascript
复制
eventBus.register(new EventObserver());

最后通知观察者,如下所示:

代码语言:javascript
复制
eventBus.post(message);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13362636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档