【问题标题】:Implement a listener for a Class instead of an instance为类而不是实例实现侦听器
【发布时间】:2013-05-10 18:44:24
【问题描述】:

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

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

我认为的另一种选择是在MyEventClass 中使用广播,在MyClass 中使用接收器,但我不确定,可能是矫枉过正,并且接收器也将被注册(并在onStop() 上取消注册)

第三种选择是为MyClass 类定义侦听器实现,而不是为每个实例定义,这将非常适合,但我不知道这是否可能以及如何编写它.

我刚刚想到的第四个选项是在MyClass 的父类上实现监听器,并且只在MyEventClass 中设置这个监听器,然后在事件发生循环中遍历所有MyClass 实例并手动打电话给他们的听众。这样我就不用用 MyEventClass 注册每个实例了。

【问题讨论】:

    标签: android events listener android-broadcast


    【解决方案1】:

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

    观察者模式是一种软件设计模式,其中一个对象, 称为主体,维护其依赖项的列表,称为 观察者,并自动通知他们任何状态变化, 通常通过调用他们的方法之一。主要用于实现分布式事件处理系统

    您可以通过数千个其他链接查看这些link1link2

    【讨论】:

    • Observer 与 BroadcastReceiver 有何不同? => Observer == Receiver,ObserverCollection == EventClass,notify() == sendBroadcast(),另外还要像 Receiver 一样注册观察者。
    • 坦率地说,我看不出有什么区别,尽管答案 0 这么说。它还说“观察者模式不同,主体注册一个观察者列表,当发生变化时,主体会通知所有观察者。” 这正是广播接收器可以做的,也许广播接收器可以做不仅仅是观察者模式。在任何情况下,这是我描述的可能选项之一,我认为你推荐这种方式而不是其他方式,一个有效的建议,谢谢。
    【解决方案2】:

    StinePike 就在这一点上,这是编码时遇到的一个非常标准的问题。观察者(或 Java 中的监听器)模式是对此的标准实践解决方案。你应该使用你的第一个提议,你的措辞有点不清楚,所以我会为你列出来,以防我不太清楚。

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

    【讨论】:

    • 所以,懒惰的程序员不要休息!
    • 你无法避免你无法避免的事情:)
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多