设计模式---观察者模式

观察者模式,在开发中经常遇到,比如:在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;
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值