利用Spring实现观察者模式(Oberver)

来源:互联网 发布:ubuntu高开发 编辑:程序博客网 时间:2024/06/05 23:52
转载:http://www.zhengmenbb.com/archives/298.htm
侦听者类: Observer
package com.zhengmenbb.spring.listener;import java.util.Map;public interface Observer {    public void execute(Map<String, Object> paras);    public boolean isAsyn();}

抽像侦听者

package com.zhengmenbb.spring.listener;public abstract class AbstractObserver implements Observer {    protected boolean asyn = false;    public boolean isAsyn() {        return asyn;    }    public void setAsyn(boolean asyn) {        this.asyn = asyn;    }}

一个测试的侦听者:

package com.zhengmenbb.spring.listener.observers;import java.util.Map;import com.zhengmenbb.spring.listener.AbstractObserver;public class Test1 extends AbstractObserver {    @Override    public void execute(Map<String, Object> paras) {        System.out.println("i am here");        System.out.println("thread name Observer:" + Thread.currentThread().getName());    }}

事件管理类: EventManager

package com.zhengmenbb.spring.listener;import java.util.List;import java.util.Map;public class EventManager {    private Map<String, List<Observer>> events;    public void dispatchEvent(String eventName, Map<String, Object> paras) {        if (events == null || events.isEmpty()) {            return;        }        List<Observer> observers = events.get(eventName);        for(Observer observer : observers) {            if (observer.isAsyn()) {                EventManagerThread eventManagerThread = new EventManagerThread(observer, paras);                Thread thread = new Thread(eventManagerThread);                thread.start();            } else {                observer.execute(paras);            }        }    }    public void setEvents(Map<String, List<Observer>> events) {        this.events = events;    }}class EventManagerThread implements Runnable {    private Observer observer;    private Map<String, Object> paras;    public EventManagerThread(Observer observer, Map<String, Object> paras) {        this.observer = observer;        this.paras = paras;    }    @Override    public void run() {        this.observer.execute(paras);    }}

配置文件 : listener.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd       http://www.springframework.org/schema/aop       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd       http://www.springframework.org/schema/tx       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  <bean id="eventManager" class="com.zhengmenbb.spring.listener.EventManager">    <property name="events">        <map>            <entry key="event1">                <list>               <ref bean="test1"/>                </list>            </entry>    </map>     </property>  </bean>    <bean id="test1" class="com.zhengmenbb.spring.listener.observers.Test1">  <property name="asyn" value="false"></property>  </bean>    </beans>

测试类:

package com.zhengmenbb.spring.listener;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    /**     * @param args     */    public static void main(String[] args) {        String[] locations = {"listener.xml"};        ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);        EventManager eventManager = (EventManager)ctx.getBean("eventManager");        System.out.println("thread name main:" + Thread.currentThread().getName());        eventManager.dispatchEvent("event1", null);    }}

0 0
原创粉丝点击