观察者模式

来源:互联网 发布:乐高淘宝散件怎么来的 编辑:程序博客网 时间: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()方法来主动触发容器事件。


0 0
原创粉丝点击