监听器模式,应用很广泛,是必须掌握的设计模式之一...
如:javase中swing编程, web中的listener都是采用了这个模式.
下面就简单的模拟一下吧:
1: 创建一个被监听者, person类
/**
* <dd> 类描述:被监听者
*/
public class Person {
/**
* 监听者集合
*/
private List<PersonListener> listeners = new ArrayList<PersonListener>();
/**
*注册, 添加监听者
*/
public void addPersonListener(PersonListener listener) {
listeners.add(listener);
}
public List<PersonListener> getListeners() {
return listeners;
}
/**
*当被监听者执行某个操作,产生监听事件源后,
*所有的监听者处理这个事件源
*/
private void listenersPerform(PersonEvent personEvent) {
for(PersonListener listener : listeners) {
listener.handleEvent(personEvent);
}
}
/**
* 人跑步方法...
*/
public void run() {
// 如果有监听者监听本对象, 则通知所有的监听者进行处理
if(listeners.size() > 0) {
// 执行run()方法, 产生事件源
PersonEvent personEvent = new PersonEvent(this);
listenersPerform(personEvent);
}
// 执行本身的[跑步方法
System.out.println("....人在跑步....");
}
}
2: 定义一个监听器接口 以及一个 实现类
/**
* <dd> 类描述:监听器接口对象
*/
public interface PersonListener {
/**
* 处理事件源
*/
void handleEvent(PersonEvent personEvent);
}
/**
* <dd> 类描述:具体监听者1
*/
public class ConcreatePersonListener1 implements PersonListener {
public void handleEvent(PersonEvent personEvent) {
System.out.println("== 监听器监听到了啊, 你要小心了 ==");
personEvent.getSource();
}
}
3:定义事件源对象
/**4: 测试
* <dd> 类描述:被监听者的监听事件对象
*/
public class PersonEvent {//这里可以继承自Java.util.EventObject...其实一样
private Person person;
/**
* 创建的时候, 必须传递一个被监听者对象, 来表示这些事件是哪个对象产生的.
*/
public PersonEvent(Person person) {
this.person = person;
}
/**
* 提供一个事件源所属的被监听器对象
*/
public Person getSource() {
return this.person;
}
}
public class ListenerTest {
/**
* 使用监听器模式
*/
public static void main(String[] args) {
// 创建一个被监听者
Person person = new Person();
// 创建一个监听者
PersonListener personListener1 = new ConcreatePersonListener1();
// 添加监听者
person.addPersonListener(personListener1);
// 被监听者调用监听事件
person.run();
}
}