`
rickyboy
  • 浏览: 3512 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Observer观察者模式的理解

阅读更多
观察者模式在不仅在java SWT中还是spring hibernate 应用都是非常广泛的,下面就我的理解做个记录。
首先要理解一些概念是必须的
事件源:事件源就是一个事件发生的组件,例如按钮,面板,在spring中可以表现为容器。

事件:我们都知道当我们点击一下按钮就是一个事件发生了。在具体表现为ActionEvent类。
比如时钟Timer类发生定时性动作时。

监听器:当某个事件发生的时候,监听器就会监听到,来进行相应的动作。当然一个容器有可能既是事件源。
下面是一个spring的观察者模式的事件的例子,
在spring中要想具有监听器功能就必须继承ApplicationListener
事件就要实现ApplicationEvent



下面是我实现的例子:

配置文件bean-config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 
 <bean id="emailer" class="com.starit.bean.EmailBean">
<property name="blackList">
<list>
<value>black@list.org</value>
<value>white@list.org</value>
<value>john@doe.org</value>
</list>
</property>
</bean>
<bean id="blackListListener" class="com.starit.bean.BlackListNotifier">
<property name="notificationAddress">
<value>spam@list.org</value>
</property>
</bean>
</beans>

监听器类

package com.starit.bean;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class BlackListNotifier implements ApplicationListener {   
	/** notification address */  
	private String notificationAddress;
  
	public void setNotificationAddress(String notificationAddress) {   
	this.notificationAddress = notificationAddress;   
	}   
	public void onApplicationEvent(ApplicationEvent event) {
		if (event instanceof BlackListEvent) {   
			    System.out.println(((BlackListEvent) event).getEmail().getBlackList());
		}		
	}
}


触发事件类

package com.starit.bean;
import org.springframework.context.ApplicationEvent;

public class BlackListEvent extends ApplicationEvent{
	private static final long serialVersionUID = 1L;
	private EmailBean email = null;
	public BlackListEvent(Object o) {   
        super(o); 
    }  
    public BlackListEvent(Object source, EmailBean object) {
		super(source);
		this.setEmail(object);
	}
	public void setEmail(EmailBean email) {
		this.email = email;
	}
	public EmailBean getEmail() {
		return email;
	}


事件源bean类

package com.starit.bean;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class EmailBean implements ApplicationContextAware {  
	
	private ApplicationContext ctx = null;
	/** the blacklist */  
	private List blackList;   
	public void setBlackList(List blackList){   
	    this.blackList = blackList;   
	}   
	public void setApplicationContext(ApplicationContext ctx) {   
	    this.ctx = ctx;   
	}
	public List getBlackList() {
		return blackList;
	}
    public void sendEmail(String address, String text){    
	    BlackListEvent evt = new BlackListEvent(address, (EmailBean)ctx.getBean("emailer"));   
	    ctx.publishEvent(evt);    
	}   
} 


测试类如下:
package com.starit.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
	public static void main(String args[]) {
		ApplicationContext context = new FileSystemXmlApplicationContext("beans-config.xml");
		EmailBean emailBean = (EmailBean)context.getBean("emailer");
		emailBean.sendEmail("black@list.org","1212");
	}
}


以上的实现的步骤如下:
1.注册监听器。
2.事件源容器通过ctx.publishEvent(evt);触发事件 。
3.这时候我们的监听器就会能够监听到这个事件,就能够触发相应的动作。
总结:
程序中容器是事件源。也就是观察者模式中的主体对象。实现ApplicationListener接口的是监听器,也就是Observer模式中的观察者。实现ApplicationEvent是一个事件,
ps:http://www.iteye.com/topic/1292 事件模型
    http://www.iteye.com/topic/522171  AWT事件模型
    http://www.iteye.com/topic/519498  很好理解spring监听器的例子
    http://www.iteye.com/topic/102068 观察者模式剖析
分享到:
评论

相关推荐

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    设计模式 观察者 发布/订阅 Observer

    Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...

    观察者模式Demo

    观察者模式Demo,使用推模型。 在我的博客里写了关于我对观察者模式的理解,这里是小例子。

    简单理解观察者模式(Observer)

    NULL 博文链接:https://zhang964761032.iteye.com/blog/1946418

    Java聊天室 观察者模式和单例模式

    基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式

    观察者模式的例子(java)

    .java文件。观察者模式的例子。可以运行,同时帮助理解观察者模式。

    深入理解观察者模式-Java设计模式及应用案例(第2版)-[共5页].pdf

    12.3 深入理解观察者模式 (1)深入理解 ISubject、IObserver 接口 上文中的 Subject 类中的中心数据 data 是 String 类型的,因此 IObserver 接口中定义的 refresh() 方法参数类型也是 String 类型的。若 data 改...

    Java设计模式之观察者模式(Observer模式)介绍

    主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    Javascript 模式实例 观察者模式

    有兴趣的朋友可以先了解一下一些牛人的,比如李会军大哥设计模式篇中观察者的那一节 http://www.cnblogs.com/Terrylee/archive/2006/10/23/Observer_Pattern.html说说我自己对这模式的理解,其思想核心是:每个被...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) ...17. 观察者模式 (Observer Pattern)

    C#中观察者模式的3种实现方式

    1.观察者模式是写松耦合代码的必备模式,重要性不言而喻,抛开代码层面,许多组件都采用了Publish-Subscribe模式,所以我想按照自己的理解重新设计一个使用场景并把观察者模式灵活使用在其中 2.我想把C#中实现观察者...

    02-observer-pattern

    head-first-design-pattern—02-observer-pattern(观察者模式),融入了个人的见解,里面包含错误的实现和正确的标准实现,你可以对比学习,加深对模式的理解

    23种设计模式的java源代码----容易理解的源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些设计模式源代码更容易理解

    研磨设计模式(完整带书签).part2.pdf

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    研磨设计模式(完整带书签).part1.pdf

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    23种设计模式的java源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 ...

    研磨设计模式-part2

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

Global site tag (gtag.js) - Google Analytics