2013-05-10 97 views
5

監聽器我有MyClass類的實例很多,他們ALL不得不從另一個類MyEventClass一些生成的事件作出反應。我應該怎麼做?實現的,而不是類的實例

我首先想到的是MyEventClassMyClass定義一個監聽器,並實現它,但是這將需要爲MyClass每個實例設置偵聽器,除了確定聽者在MyEventClass數組。
很多代碼/工作。

我想另一種選擇是在MyClassMyEventClass和接收器使用廣播,但我不知道,也許是overkilling,並且接收器將被註冊,以及(與未註冊的onStop()

第三選項將是爲類MyClass定義監聽器實現,而不是針對每個實例,這完全適合,但我不知道它是否可能,我該如何編碼它。

然而,我只是想出了一個第四個選項,就是要實現對父類的MyClass聽衆只有通過所有MyClass情況下設定MyEventClass這個監聽器,然後在事件發生環和手動調用他們的聽衆。這節省了我用MyEventClass註冊每個實例。

回答

0

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 
    } 

} 
+0

因此,懶惰的程序員不會中斷! – ilomambo 2013-05-10 19:59:05

+0

你無法避免你無法避免的東西:) – 2013-05-10 20:05:06

3

我認爲Observer design pattern將是您最好的選擇..

觀察者模式是一種軟件設計模式,其中一個對象, 稱爲主題,保持其家屬的名單,被稱爲 觀察員,和通常通過調用他們的方法之一來自動通知他們任何狀態的變化, 。它主要用於實現分佈式事件處理系統

與成千上萬的其他環節,你可以檢查這些link1link2

+0

Observer與BroadcastReceiver有什麼不同? =>觀察者==接收者,ObserverCollection == EventClass,notify()== sendBroadcast(),加上觀察者必須註冊與接收者相同。 – ilomambo 2013-05-10 19:07:23

+0

沒有概念是不同的..。請檢查https://sites.google.com/site/cliangusf/courses/mobile-programming/exploring-broadcast-receivers – stinepike 2013-05-10 19:10:54

+1

坦率地說,我沒有看到有什麼區別,儘管答案0是這樣說的。它也說*「觀察者模式是不同的,一個主題註冊一個觀察者列表,並且主題通知所有觀察者當改變發生。」*這正是可以用BroadcastReceivers完成的事情,也許BroadcastReceiver可以做的不僅僅是觀察者模式。無論如何,這是我描述的可能選項之一,我建議你以這種方式推薦其他人,一個有效的建議,謝謝。 – ilomambo 2013-05-10 19:20:57

相關問題