`
芝加哥09
  • 浏览: 59179 次
社区版块
存档分类
最新评论

观察者模式与spring的结合

    博客分类:
  • Java
 
阅读更多

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

分享到:
评论

相关推荐

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    行为类型模式,共十种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式。 设计模式的六大原则 开闭原则(Open Close Principle)...

    【基于java-ssm】大学生兼职论坛管理系统实现源码+lw+部署文档+讲解

    能学到什么:①了解工厂模式、策略模式、观察者模式等在 Spring 框架中的实现方式;②深入理解 IOC、AOP、代理、切面、循环依赖等设计与实现原理。 阅读建议:本资源旨在通过开发简化版 Spring 框架来学习其原理和...

    java核心面试笔记+核心知识源码降解

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    Video基础知识简介

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    黑马程序员ssm代码分享

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的; ②I0C、AOP、代理切面、循坏依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更...

    软件工程课堂笔记+期末试题

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更...

    Apifox-windows-latest

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    期末课设,基于·Android·开发

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    该项目是gradle+springboot+freemarker的项目,是对学生基本信息的增删改查。

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    SSM+课程设计+项目源代码+thymleaf

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    maven3.6.3.zip

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    apache-tomcat-8.0.32

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    zookeeper-3.4.6.zip

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    apache-maven-3.2.5.zip

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    u盘测速工具_DiskMark.rar

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    隐蔽TXT阅读器2.05 稳定版.rar

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    迅雷 11.1.8.1418.7z

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    apache-zookeeper-3.7.1-bin.tar.gz

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    Java 基础核心总结 java全方面基础知识 java开发人员必备

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    辉芒微单片机资料和手册,及软件工具

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

Global site tag (gtag.js) - Google Analytics