java - Java 中的通用观察者模式

标签 java generics observer-pattern

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 未回答的问题)。

最佳答案

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);
        }
    }
}

希望这对某人有用。

关于java - Java 中的通用观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362636/

相关文章:

java - 严重的泛型问题 : int vs. Integer java

java - 带有泛型的 CustomLinkedList

java - groupingBy 到集合 Java8

jquery - 在 jQuery 中使用观察者模式时如何防止自定义事件处理程序的多次调用

ios - 是否可以将观察者添加到 tableView.contentOffset 中?

java - 使用 SpeechRecognizer 获取已识别数据的转录

java - 以原子方式更新多行

java - 将 EditText 中的文本与数据库中的字符串进行比较

android - 事件的 Otto 事件总线运行时订阅

Java-声明新的泛型集时出现意外的类型错误