本文利用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
相关推荐
观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种...此外,Spring框架中的`ApplicationEventPublisher`和`ApplicationListener`接口也是实现观察者模式的一个常见选择,它们在企业级应用中广泛使用。
本文将深入探讨Java中的观察者模式,结合提供的文件名,我们可以看到以下几个关键类:`ObserverTest.java`、`ConcreteWatched.java`、`Watched.java`、`ConcreteWatcher.java`和`Watcher.java`。这些文件代表了观察...
13. **观察者模式(Observer)**:Spring AOP并没有直接实现观察者模式,但在Spring事件模型中,`ApplicationEventPublisher`和`ApplicationListener`接口体现了观察者模式,允许对象注册监听并响应特定事件。...
设计模式是经过时间验证的解决特定问题的通用方案,如工厂模式、单例模式、观察者模式等。在Java EE中,设计模式被广泛应用于组件交互、事务管理、数据访问等场景,帮助开发者编写更高效、可复用的代码。 2. **...
本项目"Hibernate+Struts2+观察者+工厂模式实例项目"就是一个典型的Java Web开发案例,它巧妙地结合了ORM框架Hibernate、MVC框架Struts2以及设计模式中的观察者模式和工厂模式,旨在提供一种高效、易于扩展的解决...
4. 观察者模式:Spring支持事件驱动的编程,通过`ApplicationEvent`和`ApplicationListener`接口,实现了发布-订阅的观察者模式。 5. 代理模式:Spring AOP(面向切面编程)使用动态代理模式,可以为对象提供额外的...
标题 "spring-cloud-stream结合kafka dome" 描述的是一个关于如何使用Spring Cloud Stream与Apache Kafka进行集成并创建示例应用的教程。在这个场景中,我们首先启动两个消费者(标记为kafka和kafka1),然后启动名...
通过阅读和分析Spring 1.2.6的源码,不仅可以学习到Spring的核心设计原则,还能了解到设计模式的运用,例如工厂模式、单例模式、观察者模式等。同时,这也是提升Java编程技巧和理解框架底层运作的好机会。在实际的...
观察者模式是一种行为设计模式,用于定义对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在下载过程中,可以将下载进度视为被观察的对象,用户界面或其他组件作为观察...
下面将详细解释这三个设计模式,并结合标签中的"源码"和"工具",探讨它们在实际项目中的应用。 首先,简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。简单工厂模式...
本文将深入探讨如何将ActiveMQ与Spring结合使用,以创建一个高效、可靠的分布式系统。 首先,让我们了解Java消息服务(JMS)。JMS是一个为分布式环境设计的应用程序接口,它定义了生产、发送、接收和消费消息的标准...
总的来说,Spring4的源代码包含了丰富的设计模式和最佳实践,如工厂模式、单例模式、代理模式等,以及事件驱动、观察者模式等面向切面编程的概念。通过深入研究这些源码,开发者不仅可以理解Spring框架的工作方式,...
1. 在Web开发中,Spring框架就广泛应用了设计模式,如工厂模式用于创建Bean,单例模式保证每个Bean只有一个实例,观察者模式用于事件驱动编程,策略模式用于实现AOP(面向切面编程)。 2. 在游戏开发中,状态模式常...
行为型模式则关注对象间的交互和责任分配,如解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、调解者模式、备忘录模式、观察者模式、状态模式、策略模式和访问者模式。 在Spring框架中,设计模式的...
总结来说,SpringCloud 2.0的这个示例展示了如何使用服务生产者和消费者模式进行微服务间的通信。通过Eureka实现服务注册与发现,利用RestTemplate进行服务调用,结合Ribbon进行负载均衡,以及Hystrix进行容错管理。...
行为类型模式,共十种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式。 设计模式的六大原则 开闭原则(Open Close Principle)...
3. **观察者模式**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 4. **策略模式**:定义了一系列算法,并使它们可以相互替换,使算法的变化独立于使用...
在Spring框架中,事件监听机制就应用了观察者模式,允许应用程序组件之间进行通信和协作。 3. **装饰模式 (08第八讲装饰模式.7z)** 装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而...
在设计模式上,SpringCloud大量运用了工厂模式(如服务实例的创建)、观察者模式(如服务状态的监听)和装饰器模式(如Hystrix断路器的包装)。这些模式的应用使得代码结构更加清晰,也易于扩展和维护。 配合尚硅谷...