监听器模式(观察者模式)

来源:互联网 发布:java完全自学txt下载 编辑:程序博客网 时间:2024/05/20 09:24

监听器模式,意思就是你想监听一个对象的状态,并且当其状态改变的时候可以去执行自己的一些东西。比如在Android程序中,我们看到的setOnClickListener()函数,最典型的实际模型就是按钮事件,比如,当按钮按下的时候我们要显示“Hello World”的工能,在Android里我们只需要找到Button对象,然后setOnClickListener()就行了,这就是一个监听器的模式,那么这个Button的监听器模式是怎样的呢?我们现在自己去实现:


自己的代码:


//定义监听器的接口

import com.tianyuan.test.ListenerModeTest.Event;


public interface handleEventListener {
public void handle(Event event);
}




package com.tianyuan.test;


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


public class ListenerModeTest {



/**
* 定义事件类型,这里定义了四种不同的事件类型
* 对应于GUI,类似于“单击”、“双击”等事件
* **/
public static class Event
{
public Event(int arg)
{
this.eventCategory = arg;
}
static final int event1 = 1;
static final int event2 = 2;
static final int event3 = 3;
static final int event4 = 4;
public int eventCategory = 1; //默认为1类事件
public void putEvent(int arg)
{
this.eventCategory = arg;
}
}




/**
* 定义事件源,类似于GUI界面中的
* 按钮
* **/
public static class EventSource
{
//监听器队列,放置所有监听该事件源的监听器
private ArrayList<handleEventListener> listenerList = new ArrayList<handleEventListener>();
public void strikeMethod(Event event)//触发事件函数,比如我点击了一下按钮,那么按钮就要执行这个函数
{
int index = 0;
/**
* 遍历执行所有监听器内的handle方法
* 就是挨个监听器去通知,我这里有事件发生啦!
* **/
while(index < this.listenerList.size())
{
this.listenerList.get(index).handle(event);
index++;
}
}
//用于添加监听器方法
public void addListener(handleEventListener listener)
{
this.listenerList.add(listener);
}
}


public static void main(String[] args)
{

EventSource eventSource = new EventSource(); //定义事件源,类似于添加了一个按钮一样
handleEventListener listener1 = new handleEventListener() {

@Override
public void handle(Event event) {
// TODO Auto-generated method stub
System.out.println("按一下按钮提示一个消息,我要去监听!");
}
};

handleEventListener listener2 = new handleEventListener() {

@Override
public void handle(Event event) {
// TODO Auto-generated method stub
System.out.println("按一下按钮我发送一个小时,我要进行监听!");
}
};

/**对自己的监听器进行注册**/
eventSource.addListener(listener1);
eventSource.addListener(listener2);

/**下面这个动作相当于有人点击了一下监听器
* 这里发生的类型为event2的事件
* **/
eventSource.strikeMethod(new Event(Event.event2));


}//public static void main()
}






总结:要点如下

1,在事件源对象中(相当于一个按钮)需要维护一个监听器的队列(如果需要拥有addListener()功能的话,如果简单的是希望外界可以setListener()的话,那么维护一个监听器的对象就行了)

2,当事件源里有时间发生的时候,需要它去依次执行监听器队列中每一个处理事件的函数,这里的函数就是 handleEventListener 中的handle()方法。


监听器模式还是很简单的!

原创粉丝点击