观察者模式
来源:互联网 发布:乐高淘宝散件怎么来的 编辑:程序博客网 时间:2024/06/06 05:22
有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
何时能用到它?
此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所有订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所有的订阅者就是它的观察者,发被观察者在某种情况被发起后,所以观察者的代码段 都将被执行。
而对于一个发邮件的功能来说,所有订阅了此功能的模块,只要系统到某个时间点,发邮件的事件就是被触发,此时,所有订阅了此功能的代码模块都会被执行,这种场合,我们见到的不少,如很多网站的新闻订阅,优惠订阅等等,都可以用到它。对于底层开发人员来说,你的CURD操作,如果希望在操作出错后,动态记录日志,事实上,也可以使用这个模式来实现,只要在WEB层或者BLL层订阅一下记录日志的事件即可。
观察者模式的结构图
观察者模式实现说明
SubjectBase:被观察者的基类,它包括了添加观察者,删除观察者,触发观察者的功能
Subject:其中一个被观察者
IObserver:被观察者对象接口,所以被观察者都要实现它,其中SubjectBase也会接收一个IObserver对象,用来触发所有观察者
Observer1:观察者1
Observer2:观察者2
1、ApplicationContext的事件机制是使用标准的观察者模式实现。通过ApplicationEvent(被观察者)类和ApplicationListener(观察者)接口实现。
ApplicationEvent:容器事件,必须由ApplicationContext发布;
ApplicationListener:监听器,可有容器中任何的Bean担任;
实际上,spring的时间机制和所有的时间机制都基本相似,他们都需要事件源、事件和事件监听器组成。只是此处的事件源是ApplicationContext,且事件必须由Java程序显示触发。
2、写一个事件例子:
容器事件:
/**
* 被观察者
*/
public class MyTestEvent extends ApplicationEvent {private static final long serialVersionUID = 1L;
private String id;
private String name;
public MyTestEvent(Object source) {
super(source);
}
public MyTestEvent(Object source, String id, String name) {
super(source);
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}}
监听器:
/**
* 观察者
* @author Administrator
*/
public class MyTestListner implements ApplicationListener<ApplicationEvent> {public void onApplicationEvent(ApplicationEvent arg0) {
if(arg0 instanceof MyTestEvent){
MyTestEvent event = (MyTestEvent)arg0;
System.out.println(event.getId());
}else{
}
}
}Java程序显示触发:
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-base.xml");
MyTestEvent ev = new MyTestEvent("hello", "001", "maomao");
ctx.publishEvent(ev);
}spring-base.xml监听配置:
<bean class="com.event.MyTestListner"></bean>
3、总结
当系统创建spring容器,加载spring容器时会自动触发容器事件,容器事件监听器可一件听到这些事件。除此之外,程序也可以调用ApplicationContext的publishEvent()方法来主动触发容器事件。
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 1013. Battle Over Cities (25)
- Redis缓存Object,List对象
- 分类算法之朴素贝叶斯分类
- JS基础
- SemEval-2014 论文笔记(1)
- 观察者模式
- android基础巩固:android 安卓中match、fill、wrap的区别
- windows下SVN服务器与web 站点的同步
- python 安装 与pip
- Swift3.0 功能一(持续更新)
- Leetcode-93. Restore IP Addresses
- 动态链接库(DLL)总结
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D. Dense Subsequence ST表+贪心
- 图文并茂,再次温顾七大排序算法