观察者模式,在开发中经常遇到,比如:在Java Swing开发中,经常需要给某个窗口注册监听器,给某个按钮注册点击事件;
再比如HTML中给某个输入框注册失去焦点事件onblur,然后加入处理事件发生后的方法。诸如,以上的例子,程序内部都用到了观察者模式。
观察者模式的典型案例:监听器。监听器实现涉及到以下三个对象:
1. 被监听者
2 监听者(监听器)
3. 监听事件
下面通过一个测试用例来说明。
需求:现有Person类,Person类有run方法,现在想在某个Person对象执行run时,对其进行监听。
实现:废话不多说,直接上源码了。
package org.xjh.pattern;
/**
* 观察者模式测试
* 需求:当某个person对象,进行run时,监听器报告这个person正在run.
* 提示:观察者模式的典型案例:监听器。监听器的实现涉及到以下三个对象:
* 1. 监听者(监听器) ,通常命名方式:XxxListener,这里是PersonListener
* 2. 被监听者,这里是Person对象
* 3. 监听事件,通常命名方式:XxxEvent,这里是PersonEvent
* @author xjh
*
*/
public class Observer {
public static void main(String[] args) {
//1.声明被监听者
Person p = new Person();
//2.给被监听者注册事件监听器,监听想要监听的事件
p.addPersonListener(new PersonListener(){
public void running(PersonEvent e){
System.out.println("The hashCode is " + e.getSource().hashCode() + " person is running!");
}
});
//3.让监听者做它想做的事情
p.run();
}
}
/**
* 监听器(观察者或监听者)
* 是一个接口且声明需要监听的抽象方法
* @author xjh
*
*/
interface PersonListener{
/**
* 监听跑步方法
* @param e
*/
public void running(PersonEvent e);
}
/**
* 被观察者(被监听者)
* 内部有私有成员:监听器对象。好比在某人的房间中安装微型摄像头。
* @author xjh
*
*/
class Person{
/**
* 监听器
*/
private PersonListener personListener;
/**
* 注册监听器
* @param personListener
*/
public void addPersonListener(PersonListener personListener) {
this.personListener = personListener;
}
/**
* 跑步的方法
*/
public void run() {
//判断是否注册了监听器
if(personListener != null){
personListener.running(new PersonEvent(this));
}
System.out.println("I am running! My hashCode is " + this.hashCode() + ".");
}
}
/**
* 事件(监听事件)
* 必须提供可以获取事件的发起者(事件源)的方法
* @author xjh
*
*/
class PersonEvent{
/**
* 事件源
*/
private Object eventSrc;
/**
* 实例化事件对象时需要提供事件的发起者:事件源
* @param eventSrc
*/
public PersonEvent(Object eventSrc){
this.eventSrc = eventSrc;
}
/**
* 获取事件源
* @return
*/
public Object getSource() {
return this.eventSrc;
}
}