监听者模式
说到监听者,不得不提一下回调函数这个东西,回调这个词见得最多的应该是在JavaScript语言中,比如常见的Ajax技术,$ajax中的success就是一个回调函数,函数的具体实现需要程序员自己实现,而至于函数何时被调度则取决于请求的成功与否。
回调函数多用于异步的场景,可以最大的提升程序的响应速度,克服了BIO相应的缺点。举个生活中的例子,临近期末,Steve要去学校打印店打印资料,恰逢人流高峰期,看着前面长长的队伍,他只好默默的排到队伍的最后,煎熬的等待着,对应到我们这,这是一个阻塞的过程,而异步是怎样的呢,异步在这里就相当于打印店并不需要排长长的队伍,去打印只需要将资料放在老板那里,然后给老板登记个联系方式,之后Steve便可以立马去干其他的事情,不必一直傻傻的等下去,等到资料打印好后老板自然会电话通知你去取资料,这个通知的动作就是一个回调。
其实监听者模式和回调有着异曲同工之妙,首先这里会涉及到三个对象。
- 事件源 (事件发生的源头,作为被监听的对象)
- 事件对象 (事件本身,用于包装事件源,提供事件的属性等)
- 监听器 (事件发生后需要执行的动作,即回调函数)
现在我们来实现一个最容易理解的Button(按钮)控件,并实现他的Click(单击)事件。
首先定义一个事件源Button
1 | class Button { |
之后继承JDK提供的EventObject类来定义我们自己的事件对象
1 | class ClickEvent extends EventObject { |
最后继承JDK提供的EventListener接口来规定自己的监听器接口
1 | interface ClickListener extends EventListener { |
主函数测试
1 | public class Main { |
里面的函数式写法JDK1.8开始支持,我以后可能也会写相关的总结,可以先不管。来看下输出结果吧
按钮被点击
弹出对话框
完美,按钮被成功按下,并且也弹出了我们想要的对话框。
写在最后
1.能不去继承JDK的类和接口吗?
能!能!能!这样写只是为了规范考虑,因为大佬都这么写,不这样写你会被骂low
2.还没想到…