观察者接口Observer
public interface Observer {
public void execute(Map<String, Object> paras) throws ServerException;
public Boolean isAsyn();
}
1、paras为观察者观察时接收的对象,通常使用Map封装,或给每个观察事件都定义一个参数类用来封装不同的事件所需要信息
2、isAsyn 判断是否异步,如果是异步,就需要重新开一个线程
抽象对象AbstractObserver
protected Boolean asyn = false;
public Boolean getAsyn() {
return asyn;
}
public void setAsyn(Boolean asyn) {
this.asyn = asyn;
}
定义事件处理类EventManager,统一管理观察者
private Map<String, List<Observer>> events;
public void dispatchEvent(String eventName, Map<String, Object> paras) throws ServerException {
if (events == null || events.isEmpty()) {
return;
}
List<Observer> observers = events.get(eventName);
for(Observer observer : observers) {
System.out.println("eventName: " + eventName);
System.out.println("isAsyn: " + observer.isAsyn());
if (observer.isAsyn()) {
EventManagerThread eventManagerThread = new EventManagerThread(observer, paras);
Thread thread = new Thread(eventManagerThread);
thread.start();
} else {
observer.execute(paras);
}
}
}
1、这里使用的思想是在程序运行时将所有的观察者注册到事件管理类中
2、当事件发生时,被观察者需要提供事件信息,以及相应的事件的观察者的名字
3、在dispatchEvent方法中根据事件观察者名,调用相应的处理方法
在application.xml中配置观察者
<bean id="eventManager" class="xxx.EventManager">
<property name="events">
<map>
<entry key="recordSprintUserStatusEvent">
<list>
<ref bean="recordSprintUserStatus"/>
</list>
</entry>
<entry key="cacadeUpdateUserStory">
<list>
<ref bean="cacadeUpdateUserStory"/>
</list>
</entry>
</map>
</property>
</bean>
1、entry中的key值就是各个观察者的名字,eventManager根据名字调用相应的观察者