观察者模式与spring的组合
观察者模式与spring的结合
本文利用spring强大的注入功能,实现了观察者模式。本文的例子对于有很多的if...else...同时相应的处理算法又很类似情况是一种解决方案。代码如下:(有代码才有真相。。。)
抽象观察者类:Observer.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 这是一个抽象观察者类。 * @author 芝加哥 * */ public interface Observer { public void setValue(ModelColumn model); }
具体的观察者类:
ConcreteObserver1.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver1 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr1("ConcreteObserver1"); } }
ConcreteObserver2.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver2 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr2("ConcreteObserver2"); } }
ConcreteObserver3.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver3 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr3("ConcreteObserver3"); } }
ConcreteObserver4.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver4 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr4("ConcreteObserver4"); } }
ConcreteObserver5.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver5 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr5("ConcreteObserver5"); } }
ConcreteObserver6.java
package com.cloud.observer; import com.cloud.observer.model.ModelColumn; /** * 具体观察者。 * @author 芝加哥 * */ public class ConcreteObserver6 implements Observer { @Override public void setValue(ModelColumn model) { model.setStr6("ConcreteObserver6"); } }
Model类:ModelColumn.java
package com.cloud.observer.model; /** * 这是一个model类,用于封装属性的。 * @author 芝加哥 * */ public class ModelColumn { private String str1; private String str2; private String str3; private String str4; private String str5; private String str6; public String getStr1() { return str1; } public void setStr1(String str1) { this.str1 = str1; } public String getStr2() { return str2; } public void setStr2(String str2) { this.str2 = str2; } public String getStr3() { return str3; } public void setStr3(String str3) { this.str3 = str3; } public String getStr4() { return str4; } public void setStr4(String str4) { this.str4 = str4; } public String getStr5() { return str5; } public void setStr5(String str5) { this.str5 = str5; } public String getStr6() { return str6; } public void setStr6(String str6) { this.str6 = str6; } @Override public String toString() { return this.str1 + ", " + this.str2 + ", " + this.str3 + ", " + this.str4 + ", " + this.str5 + ", " + this.str6; } }
事件管理类:EventManager.java
package com.cloud.observer.service; import java.util.List; import java.util.Map; import com.cloud.observer.Observer; import com.cloud.observer.model.ModelColumn; /** * 这是一个事件的管理类,根据不同的事件名作出不同处理。 * 但处理的算法是一样的。 * @author 芝加哥 * */ public class EventManager { private Map<String, List<Observer>> events; public void dealWithEvent(String eventName, ModelColumn model) { if (null == eventName || eventName.isEmpty()) { return; } List<Observer> observers = events.get(eventName); for (Observer observer : observers) { if (null != observer) { observer.setValue(model); } } } public void setEvents(Map<String, List<Observer>> events) { this.events = events; } }
测试类:ObserverTest.java
package com.cloud.observer.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.cloud.observer.model.ModelColumn; import com.cloud.observer.service.EventManager; /** * 测试类。 * @author 芝加哥 * */ public class ObserverTest { public static void main(String[] args) { String[] locations = {"observer.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(locations); EventManager eventManager = (EventManager)ctx.getBean("eventManager"); ModelColumn model = new ModelColumn(); eventManager.dealWithEvent("eventName2", model); System.out.println(model.toString()); } }
spring的xml配置:observer.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.cloud.observer.service.EventManager"> <property name="events"> <map> <entry key="eventName1"> <list> <ref bean="concreteObserver1"/> <ref bean="concreteObserver2"/> <ref bean="concreteObserver3"/> </list> </entry> <entry key="eventName2"> <list> <ref bean="concreteObserver4"/> <ref bean="concreteObserver5"/> <ref bean="concreteObserver6"/> </list> </entry> </map> </property> </bean> <bean id="concreteObserver1" class="com.cloud.observer.ConcreteObserver1"/> <bean id="concreteObserver2" class="com.cloud.observer.ConcreteObserver2"/> <bean id="concreteObserver3" class="com.cloud.observer.ConcreteObserver3"/> <bean id="concreteObserver4" class="com.cloud.observer.ConcreteObserver4"/> <bean id="concreteObserver5" class="com.cloud.observer.ConcreteObserver5"/> <bean id="concreteObserver6" class="com.cloud.observer.ConcreteObserver6"/> </beans>
运行结果:null, null, null, ConcreteObserver4, ConcreteObserver5, ConcreteObserver6