为类而不是实例实现一个侦听器

时间:2013-05-10 18:44:25

标签: android events listener android-broadcast

我有很多MyClass的实例,而且 ALL 必须对来自另一个类MyEventClass的某些生成的事件作出反应。我该怎么做?

我的第一个想法是在MyEventClass中定义一个监听器并在MyClass中实现它,但这需要MyClass的每个实例设置监听器,并且除了定义将监听器作为MyEventClass中的数组 很多代码/工作。

我认为另一种选择是MyEventClass中的广播和MyClass中的接收者,但我不确定,可能是过度使用,接收者也要注册(并且未注册{ {1}})

第三个选项是定义类onStop()的监听器实现,而不是每个实例,这完全适合,但我不知道它是否可行,我该怎么做编码。

我刚刚提出的第四个选项是在MyClass的父类上实现监听器,并且仅在MyClass中设置此监听器,然后在事件发生循环中通过所有{{} 1}}实例并手动调用其侦听器。这节省了我使用MyEventClass注册每个实例。

2 个答案:

答案 0 :(得分:3)

我认为Observer design pattern将是您的最佳选择..

  

观察者模式是一个软件设计模式,其中一个对象,   称为主题,维护其受抚养人名单,称为   观察者,并自动通知他们任何状态变化,   通常通过调用他们的方法之一。它主要用于实现分布式事件处理系统

有数以千计的其他链接,您可以查看这些link1link2

答案 1 :(得分:0)

StinePike是正确的,这是编码时遇到的一个非常标准的问题。 Observer(或Java talk中的监听器)模式是此标准实践解决方案。你应该使用你的第一个命题,你的措辞有些不清楚,所以如果我不太清楚的话,我会把它给你。

MyEventClass提供一个监听器界面,如MyEventClassListener,以及添加/删除方法。然后MyClass可以作为听众附加/分离自己。以下是您需要的代码示例:

<强> MyEventClass.java

public class MyEventClass {

    private Set<MyEventClassListener> listeners = new HashSet<MyEventClassListener>();

    // Your code here...

    public void addListener(MyEventClassListener listener) {
        listeners.add(listener);
    }

    public void removeListener(MyEventClassListener listener) {
        listeners.remove(listener);
    }

    public void notifyListeners() {
        for (MyEventClassListener listener : listeners) {
            listener.somethingHappened();
        }
    }

}

<强> MyEventClassListener.java

public interface MyEventClassListener {

    public void somethingHappened();

}

<强> MyClass.java

public class MyClass implements MyEventClassListener {

    MyEventClass myEventClass;

    // Your code here..

    public void someFunction() {
        // Add as listener
        myEventClass.addListener(this);
    }

    @Override
    public void somethingHappened() {
        // Act on callback
    }

}