监听者模式
一、
监听者模式也叫观察者模式
监听器Listener
监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听别一个类的方法调用。
都是使用观察者设计模式。
什么是观察者模式:
定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
示例:
GUI编程中的addXxxxListener都是观察者模式。
观察者模式的三个重要类:
观察者设计模式示例:
1、开发步骤:
* 第一步:实现一个需要被监听的类Person.
* 第二步:实现一个监听接口PersonListener。
* 第三步:在Person类中,提供一个方法用于注册PersonListener类,即registerListener
* 第四步:必须要在Person类中维护PersonListener类的实例。
* 第五步:在调用person.eat方法是,判断PersonListener是否为null,如果不为null则调用它的eating方法。
* 第六步:在Main类中,实例化Person,并注册一个监听。
被监听者Person
package cn.hncu.designPattern;
public class Person {
private String name;
private IPersonRunListener listener1;
private IPersonRunListener listener2;
public Person(String name) {
this.name = name;
}
public void run() {
if(listener1!=null){
listener1.fighting();
}
System.out.println(this.name + " is running....");
if(listener2!=null){
listener2.fighting();
}
}
public void addBefore(IPersonRunListener listener){
this.listener1 = listener;
}
public void addAfter(IPersonRunListener listener){
this.listener2 = listener;
}
}
interface IPersonRunListener {
public void fighting();
}
监听者
package cn.hncu.designPattern;
public class Demo {
public static void main(String[] args) {
Person p = new Person("Jack");
IPersonRunListener a = new A();
p.addAfter(a);
p.addBefore( new IPersonRunListener() {
@Override
public void fighting() {
System.out.println("注意做点准备活动....");
}
});
p.run();
}
}
class A implements IPersonRunListener{
@Override
public void fighting() {
System.out.println("加油...做死的跑...");
}
}
第一步:前页改Person为Cat的基础上继续添加一个CatEvent类(注意我说是类不是接口),代表事件对像。
第二步:修改ICatListener接口的climbing方法,让它接收一个 CatEvent参数。
第三步:在Cat类climbing方法中,如果判断ICatListener属性不为空,则在调用climbing方法,实例化 CatEvent并传给climbing方法。
第四步:在main方法中,通过 CatEvent的getSource方法测试是否是同一个对像。
package cn.hncu.designPattern.two;
public class Cat {
private ICatListener listener = null;
private String name;
public Cat(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void climb() {
System.out.println(name+"正在爬.....");
if (listener != null) {
listener.help(new CatEvent(this));
}
}
public void addCatListener(ICatListener listener) {
this.listener = listener;
}
@Override
public String toString() {
return name;
}
}
interface ICatListener {
public void help(CatEvent e);
}
class CatEvent {
private Cat cat = null;
public CatEvent(Cat cat) {
this.cat = cat;
}
public Object getSou