其实,道理很简单的。
【监听方】
我要监听某个东东,那么我肯定得有一个监听器/或叫观察者myObserver。
我的监听器里,有个method,来处理监听过来的数据update()。
那么:
(1)这个Listener和method有什么要求呢?就是必须实现被监听方给你的接口interface。Observer
(2)这个listener如何注册给被监听方呢?方法很多,例如被监听方给出一个单例类C,让调用方调用C.getInstance().setListener(ourListener); 注进去
【被监听方】
被监听方,往往维护着一个List<listener>,在某个东东变更之后,告知所有监听器(for()循环调用listener.method()),于是就实现了监听。
【随便一说】
被监听方,可以用自己的线程去告知所有监听器,也可以调用监听器自身的线程池进行处理。
我个人比较倾向于后者,因为如果处理程序比较复杂,使用监听器自身线程池可以异步化,将被监听方线程解脱出来。
监听方,可以是new出来的,也可以是bean装配进来的,这个没关系。
【程序模样】
[1]Subject向外提供的接口Observer
class Observer{
notify();
}
[2]调用方myObserver
class MyListener{
Observer listener = new myObserver(); //可new,可装配
public void doBizOperation(){
}
class myObserver implements Observer{
notify(){
}
}
}
[3]被调用方Subject
class Subject{
List<InterfaceByCalled> listeners = new List<InterfaceByCalled>();
public void setListener(InterfaceByCalled listener){
listeners.add(listener);
}
public List<Observer> informListeners(){
for(Observer listener:this.listeners){
listener.notify();
}
}
}
[4]最后,将MyListener注入到Subject中即可。
Observer observer = myListener.getListener();
subject.setListener(observer);