监听者设计模式有三要素:被监听者、监听者、事件对象
大体的过程就是:被监听者提供一个添加监听的方法,监听者要 监听 被监听者 的时候就得提供一个接口的实现。
1.被监听者:
被监听者至少有一个行为是他可以被别人监听到的,这个方法就是下面的talk( ),当执行到这个方法的时候便会通知所有的监听者他执行了这个方法。
package listernDemo2;
import java.util.ArrayList;
import java.util.List;
/**
* 被监听者 - 事件源
* @author BarryLee
* @2018年9月27日@下午5:45:10
*/
public class Person {
//提供一个对外的方法,让监听者添加监听方法
private List<IPerson>list = new ArrayList<IPerson>();
public void addActionListener(IPerson person){
list.add(person);
}
//被监听的事件
public void talk() {
for (IPerson iPerson : list) {
PersonEvent event = new PersonEvent(this);
iPerson.runAction(event);
}
}
}
2.接口:
package listernDemo2;
/**
* 注册监听器必须要实现这个接口
* @author BarryLee
* @2018年9月27日@下午5:45:15
*/
public interface IPerson {
public abstract void runAction(PersonEvent e);
}
3.事件对象:
提供事件源的信息
package listernDemo2;
/**
* 事件对象
* @author BarryLee
* @2018年9月27日@下午5:45:03
*/
public class PersonEvent {
private Object object;
public PersonEvent(Object object){
this.object = object;
}
public Object getSource(){
return object;
}
}
4.测试类:
初始化事件源 -> 注册监听器 -> 使用事件对象
package listernDemo2;
import org.junit.Test;
/**
* 测试类
* @author BarryLee
* @2018年9月27日@下午5:44:46
*/
public class TestDemo {
@Test
public void test(){
Person person = new Person();
person.addActionListener(new IPerson() {//注册一个监听器
@Override
public void runAction(PersonEvent e) {
System.out.println("听到有人在讲话:"+e.getSource());
}
});
person.talk();
}
}
最后说一句:监听者设计模式本身并不难,难就难在实际应用中能否想到。