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

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

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种...此外,Spring框架中的`ApplicationEventPublisher`和`ApplicationListener`接口也是实现观察者模式的一个常见选择,它们在企业级应用中广泛使用。

    java设计模式之观察者模式

    本文将深入探讨Java中的观察者模式,结合提供的文件名,我们可以看到以下几个关键类:`ObserverTest.java`、`ConcreteWatched.java`、`Watched.java`、`ConcreteWatcher.java`和`Watcher.java`。这些文件代表了观察...

    第四章:Spring AOP API 设计模式1

    13. **观察者模式(Observer)**:Spring AOP并没有直接实现观察者模式,但在Spring事件模型中,`ApplicationEventPublisher`和`ApplicationListener`接口体现了观察者模式,允许对象注册监听并响应特定事件。...

    Java EE设计模式:Spring企业级开发最佳实践

    设计模式是经过时间验证的解决特定问题的通用方案,如工厂模式、单例模式、观察者模式等。在Java EE中,设计模式被广泛应用于组件交互、事务管理、数据访问等场景,帮助开发者编写更高效、可复用的代码。 2. **...

    Hibernate+struts2+观察者+工厂模式实例项目

    本项目"Hibernate+Struts2+观察者+工厂模式实例项目"就是一个典型的Java Web开发案例,它巧妙地结合了ORM框架Hibernate、MVC框架Struts2以及设计模式中的观察者模式和工厂模式,旨在提供一种高效、易于扩展的解决...

    结合业务场景应用设计模式.docx

    4. 观察者模式:Spring支持事件驱动的编程,通过`ApplicationEvent`和`ApplicationListener`接口,实现了发布-订阅的观察者模式。 5. 代理模式:Spring AOP(面向切面编程)使用动态代理模式,可以为对象提供额外的...

    spring-cloud-stream结合kafka dome

    标题 "spring-cloud-stream结合kafka dome" 描述的是一个关于如何使用Spring Cloud Stream与Apache Kafka进行集成并创建示例应用的教程。在这个场景中,我们首先启动两个消费者(标记为kafka和kafka1),然后启动名...

    spring1.2.6源码

    通过阅读和分析Spring 1.2.6的源码,不仅可以学习到Spring的核心设计原则,还能了解到设计模式的运用,例如工厂模式、单例模式、观察者模式等。同时,这也是提升Java编程技巧和理解框架底层运作的好机会。在实际的...

    SPRING组装的断点续转下载软件

    观察者模式是一种行为设计模式,用于定义对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在下载过程中,可以将下载进度视为被观察的对象,用户界面或其他组件作为观察...

    简单工厂,代理模式,单例模式demo

    下面将详细解释这三个设计模式,并结合标签中的"源码"和"工具",探讨它们在实际项目中的应用。 首先,简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。简单工厂模式...

    ActiveMQ与Spring联合使用Demo

    本文将深入探讨如何将ActiveMQ与Spring结合使用,以创建一个高效、可靠的分布式系统。 首先,让我们了解Java消息服务(JMS)。JMS是一个为分布式环境设计的应用程序接口,它定义了生产、发送、接收和消费消息的标准...

    spring4最新源代码

    总的来说,Spring4的源代码包含了丰富的设计模式和最佳实践,如工厂模式、单例模式、代理模式等,以及事件驱动、观察者模式等面向切面编程的概念。通过深入研究这些源码,开发者不仅可以理解Spring框架的工作方式,...

    24种设计模式以及混合设计模式

    1. 在Web开发中,Spring框架就广泛应用了设计模式,如工厂模式用于创建Bean,单例模式保证每个Bean只有一个实例,观察者模式用于事件驱动编程,策略模式用于实现AOP(面向切面编程)。 2. 在游戏开发中,状态模式常...

    Tom_深入分析Spring5源码1

    行为型模式则关注对象间的交互和责任分配,如解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、调解者模式、备忘录模式、观察者模式、状态模式、策略模式和访问者模式。 在Spring框架中,设计模式的...

    SpringCloud-2.0-服务生产者和消费者代码的创建.zip

    总结来说,SpringCloud 2.0的这个示例展示了如何使用服务生产者和消费者模式进行微服务间的通信。通过Eureka实现服务注册与发现,利用RestTemplate进行服务调用,结合Ribbon进行负载均衡,以及Hystrix进行容错管理。...

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

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

    Spring2.5-中文参考手册+JAVA设计模式

    3. **观察者模式**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 4. **策略模式**:定义了一系列算法,并使它们可以相互替换,使算法的变化独立于使用...

    设计模式及代码

    在Spring框架中,事件监听机制就应用了观察者模式,允许应用程序组件之间进行通信和协作。 3. **装饰模式 (08第八讲装饰模式.7z)** 装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而...

    尚硅谷SpringCloud的源码及思维导图

    在设计模式上,SpringCloud大量运用了工厂模式(如服务实例的创建)、观察者模式(如服务状态的监听)和装饰器模式(如Hystrix断路器的包装)。这些模式的应用使得代码结构更加清晰,也易于扩展和维护。 配合尚硅谷...

Global site tag (gtag.js) - Google Analytics