您的位置:首页 > 编程语言 > Java开发

java中的监听机制——观察者设计模式详解

2015-03-18 00:51 555 查看
好久没有做笔记了,我发现研究过一个东西后忘的很快,等下次遇到后还得重新查资料学,倒不如写篇笔记记录一下下次遇到相同的问题后查查笔记瞬间就知道了,从而节省了好多时间,今天心血来潮哈哈,写一篇简单的笔记找找感觉重拾斗志,以下内容纯属个人理解,如有错误欢迎大家批评指正,,哈哈。。。废话不多说进入正题,
一、监听机制介绍
在android的开发中我们经常会遇到,一个类A去监听一个类B成员的变化从而在类A去去进行回调来达到更新的效果,这就是一种简单的监听机制。
监听机制的处理流程图如下:




二、监听机制实例详解
若想搞清楚监听机制我们必须弄清楚以下5个概念:
1事件源,被监听对象。
2监听器:用于监听1
3绑定:是2去监听1
4 事件:在1进行相应的操作
5 事件对象:在4中,通过5可以获得1
可能理解起来比较绕下面我们通过一个简单的例子来进行详细的介绍
首先看下目录结构



目录介绍:

上面的目录中我们是想在TestSon这个类中去监听Son的动作

/**
 * 每一个孩子都应该有一个匹配的SonListener,每一个监听的事件都应该有与之匹配的事件对象
 * @author Shimmer
 *
 */
public class Son {
	
	ISonListener sonListener;//缓冲监听的引用
	
	private String name;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	//son 的吃饭方法
     public void eat(){
    	 System.out.println("我在吃饭中。。。");
    	 if(sonListener!=null){
              sonListener.eatting(new MySonEvent(this));//这里的this是指当前的对象就是当前的Son
    		 				        //传过去之后会返回当前的Son即我们监听的是当前的孩子
    	 }
     }
     //son的睡觉方法
     public void sleep(){
    	 System.out.println("我在睡觉中。。。");
    	 if(sonListener!=null){
    		 sonListener.sleeping(new MySonEvent(this));
    	 }
     }
     
     public void setSonListener(ISonListener sonListener){
    	 this.sonListener=sonListener;
     }
}

//实现监听对象获得事件源
 class MySonEvent implements ISonEvent{

	 private Son son;
	 public MySonEvent(Son son) {
		 this.son=son;
	}
	@Override
	public Son getSon() {
		return this.son;
	}
	 
 }

监听孩子的类

TestSon

package com.tsingda.listener;

//在这个类中对孩子的动作进行监听
public class TestSon {
	/**
	 * 1事件源,被监听对象。 
	 * 2监听器:用于监听1 
	 * 3绑定:是2去监听1 
	 * 4 事件:在1进行相应的操作 
	 * 5 事件对象:在4中,通过5可以获得1
	 */

	public static void main(String args[]) {
		// 1 获得监听对象 son
		Son son = new Son();

		son.setName("小明");
		// 3 绑定(注册监听器)
		son.setSonListener(new MySonListener());
		
		// 4 事件 
		son.eat();
		son.sleep();
	}
}

// 2 监听器 用于监听son这个对象
class MySonListener implements ISonListener {

	@Override
	public void eatting(ISonEvent son) {
		//5 通过事件对象获得事件源
		String name=son.getSon().getName();
		System.out.println("监听孩子吃饭"+name);
	}

	@Override
	public void sleeping(ISonEvent son) {
		String name=son.getSon().getName();
		System.out.println("监听孩子睡觉"+name);
	}

}
两个接口的代码如下

package com.tsingda.listener;

public interface ISonEvent {
	public Son getSon();
}
package com.tsingda.listener;

public interface ISonListener {
	
	public void eatting(ISonEvent son);//监听孩子吃饭的方法
	public void sleeping(ISonEvent son);//监听孩子睡觉的方法
}

打印的结果:



虽然比较简单但是总觉着自己理解的不够透彻,学东西就要学的透彻点。晚上一点多了睡觉

,这就是奋斗的程序员的生活,哈哈。。。

若果有哪个地方写的不对,欢迎大家批评指正谢谢

源码地址



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: