设计模式---监听器模式

时间:2022-10-01 22:20:33

监听器模式,应用很广泛,是必须掌握的设计模式之一...

如: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:定义事件源对象

/**
* <dd> 类描述:被监听者的监听事件对象
*/
public class PersonEvent {//这里可以继承自Java.util.EventObject...其实一样

private Person person;

/**
* 创建的时候, 必须传递一个被监听者对象, 来表示这些事件是哪个对象产生的.
*/
public PersonEvent(Person person) {

this.person = person;
}

/**
* 提供一个事件源所属的被监听器对象
*/
public Person getSource() {

return this.person;
}

}
4: 测试

public class ListenerTest {

/**
* 使用监听器模式
*/
public static void main(String[] args) {

// 创建一个被监听者
Person person = new Person();

// 创建一个监听者
PersonListener personListener1 = new ConcreatePersonListener1();

// 添加监听者
person.addPersonListener(personListener1);

// 被监听者调用监听事件
person.run();

}


}