深入浅出设计模式之事件监听模式

介绍:
事件监听模式也叫事件监听机制。一般用在很多界面化编程中,比如当我们按下一个按钮时,会产生相应的反应,而这个按钮就是 事件源。而我们的程序有一个按钮 监听器 来监听按钮。
实时上,事件监听模式不属于23种设计模式,是 观察者模式 的一种实现。(http://blog.csdn.net/qq_25673113/article/details/52068680

组成结构:
Java中的事件监听机制主要由事件源、事件对象、事件监听器三个部分组成。

1)事件源(event source):
具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
2)事件对象(event object):
一般继承自java.util.EventObject类,封装了事件源对象以及与事件相关的信息。它是在事件源和事件监听器之间传递信息的。
3)事件监听器(event listener):
实现java.util.EventListener接口,需要注册在事件源上才能被调用。它监听事件,并进行事件处理或者转发。

观察者(Observer)相当于事件监听者,被观察者(Observable)或者说主题(Subject)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数。

其实事件机制中的“事件对象”就相当于上例观察者模式中的notify中的String参数对象。

例子:
事件监听机制非常常用,所以jdk都帮我们实现了一系列接口,我们只要实现这些接口就可以了。(下面代码都是 伪代码,实际工程请慎重使用。。。。)
package Obser2;

import java.util.EventObject;
/**
 * 点击事件
 * @author lkj41110
 *
 */
public class ButtonEvent extends EventObject{

	//模拟坐标
	private int x,y;
	
	public ButtonEvent(Object source) {
		super(source);
	}
	
	public String getButtonName(){
		return source.toString();
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	@Override
	public String toString() {
		return getButtonName();
				
	}
	
	
}

package Obser2;

import java.util.EventListener;

/**
 * 事件监听器
 * @author lkj41110
 */
interface IButtonListener extends EventListener{
	//EventListener是所有事件侦听器接口必须扩展的标记接口、因为它是无内容的标记接口、     
    //所以事件处理方法由我们自己声明如下:
	public void dealEvent(ButtonEvent event);
}
public class ButtonListener implements IButtonListener{

	@Override
	public void dealEvent(ButtonEvent event) {
		System.out.println("监视器发现按钮  "+event+"在x:"+event.getX()+"   y:"+event.getY()+"处按下");
	}
	
}


package Obser2;

import java.util.ArrayList;
import java.util.List;

/**
 * 事件源
 * @author lkj41110
 */
public class MyBotton {
	private List<IButtonListener> list=new ArrayList<IButtonListener>();
	//注册监听器
	
	private String name;
	
	public MyBotton(String name){
		this.name=name;
	}
	
	public void addActionListener(IButtonListener listener){
		list.add(listener);
	}
	//取消监听器
	public void removeActionListener(IButtonListener listener){
		if(list.contains(listener)){
			list.remove(listener);
		}
	}
	//通知监听器
	private void notifyListener(ButtonEvent event){
		for(int i=0;i<list.size();i++){
			list.get(i).dealEvent(event);
		}
	}
	//按下按钮
	public void press(int x,int y){
		System.out.println("按下一个按钮");
		ButtonEvent event=new ButtonEvent(this);
		event.setX(x);
		event.setY(y);
		notifyListener(event);
	}
	@Override
	public String toString() {
		return name;
	}
	
}
package Obser2;

public class Test {
	public static void main(String[] args) {
		//创建一个事件源,也就是按钮
		MyBotton button=new MyBotton("按钮1");
		ButtonListener listener1=new ButtonListener();
		button.addActionListener(listener1);
		//在1,2处按下
		button.press(1, 2);
		//可以方便使用匿名内部类
		button.addActionListener(new IButtonListener() {
			@Override
			public void dealEvent(ButtonEvent event) {
				System.out.println("我是监视器   ");
				System.out.println("发现按钮  "+event+"在x:"+event.getX()+"   y:"+event.getY()+"处按下");
				System.out.println("!!!!");
			}
		});
		button.press(10,10);
		
		button.removeActionListener(listener1);
		button.press(2, 4);
		
	}
}
结果:
按下一个按钮
监视器发现按钮  按钮1在x:1y:2处按下
按下一个按钮
监视器发现按钮  按钮1在x:10y:10处按下
我是监视器   
发现按钮  按钮1在x:10y:10处按下
!!!!
按下一个按钮
我是监视器   
发现按钮  按钮1在x:2y:4处按下
!!!!


是不是从上面的例子里看到了观察者的模式的影子呢。
当然我们这里的button和jdk中的按钮还是很多不一样的,有兴趣的朋友可以可以去研究一下代码。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值