观察者模式与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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值