本文利用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