本文实例讲述了java设计模式之监听器模式。分享给大家供大家参考,具体如下:
监听器模式有三个要素——事件源、事件对象、监听器。
事件源:顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象;
事件对象:这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件,比如点击事件,和事件源的区别自己感受,木有栗子;
监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。
下面举个简单的栗子:
故事背景是,小明是个不讲卫生的孩子,他妈妈很担心他的健康,规定必须饭前洗手。
定义一个熊孩子。熊孩子就是被监听的对象,是事件源,一切事件都是事件源发出,这似乎是句废话。
public class child { private string name; private remindlistener remindlistener; public child(string name){ this.name = name; } public void eat() { if(null!=remindlistener){ remindlistener.remind(new remindwashinghandsevent(this)); } system.out.println("child eat..."); } public void addlistener(remindlistener listener){ remindlistener = listener; } }
接下来是看看事件对象,事件对象正如上面所述,包装了事件源。我们在这里定义一个饭前洗手事件。
public class remindwashinghandsevent { private child child; public remindwashinghandsevent(child child){ this.child = child; } }
事件对象定义了事件的属性、状态。
紧接着是定义事件发生后,监听器的动作,在这里是提醒洗手。
public class remindlistener { public void remind(remindwashinghandsevent remindwashinghandsevent){ system.out.println("listen to mom, washing hands before eating..."); } }
注意,监听器主要封装了动作,仅此而已。
以上代码,只是为了说明监听器模式原理,代码通俗,不太优雅。
下面继承或实现java标准库,又随手写了一对代码,夜深了,有时间再解释。
public class kid{ private string name; private list<listener> liteners; public kid(string name) { this.name = name; this.liteners = lists.newarraylist(); } public void eat(){ for(listener listener:liteners){ if(listener instanceof washinghandslistener){ washinghandslistener washinghandslistener = (washinghandslistener) listener; washinghandslistener.fireaftereventinvoked(new washinghandsevent(this,"洗手")); } } system.out.println("吃饭..."); } public void addlistener(listener listener){ liteners.add(listener); } } public class event extends eventobject { /** * constructs a prototypical event. * * @param source the object on which the event initially occurred. * @throws illegalargumentexception if source is null. */ public event(object source) { super(source); } } public class washinghandsevent extends event{ private string eventname; /** * constructs a prototypical event. * * @param source the object on which the event initially occurred. * @throws illegalargumentexception if source is null. */ public washinghandsevent(object source,string eventname) { super(source); this.eventname = eventname; } public string geteventname() { return eventname; } public void seteventname(string eventname) { this.eventname = eventname; } } public interface listener extends java.util.eventlistener{ public void fireaftereventinvoked(event event); } public class washinghandslistener implements listener{ @override public void fireaftereventinvoked(event event) { washinghandsevent washinghandsevent = (washinghandsevent) event; system.out.println("饭前准备"+ washinghandsevent.geteventname()); } } public class test { public static void main(string[] args) { kid xiaoming = new kid("xiaoming"); xiaoming.addlistener(new washinghandslistener()); xiaoming.eat(); } }
输出结果:
更多java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
如对本文有疑问, 点击进行留言回复!!
网友评论