事件监听模式是观察者模式的一种特殊情况,在事件监听模式中有三个重要的概念:
-- 事件源(source)
-- 事件对象 (Event)
-- 事件监听器(Listener)
这三个名称的解释可以先缓一缓,看完理解之后自然会知道其含义,先回顾一下观察者模式:
观察者模式中主要由被观察者与观察者这两个模块构成,观察者模式比较简单,每添加一个观察者对象到被观察者中时会触发执行被观察者对象中的所有观察者的逻辑。
事件监听模式与观察模式很相似:
1. 都采用了遍历的方式来处理事件的方式
2. 事件监听模式中的事件源相当于观察者模式中的被观察者
3. 事件监听模式中的事件监听器相当于观察者模式中的观察者
不同的是,相对“观察者模式”,“事件监听模式”在传递的参数方面做了进一步的工作,在观察者模式中调用“添加观察者”模块(上图)可以给观察者对象传递参数。在事件监听模下“观察者参数”升级为了一个事件,事件的实例对象也就是事件对象。
相比观察者模式中的观察者参数,事件监听模式中的事件对象能做的事情更多,它在内部定义了一个Object的对象source,作用是将事件源与事件对象捆绑到一起,在事件监听器执行逻辑时,就可以同时操作事件对象与事件源对象了。
这里使用一个按钮监听的示例来展示一下事件监听模式的应用,首先给出设计的流程图:
测试类:
package cjj.listener; /** * @author chenjunjie * @since 2018-05-14 */ public class MainTest { public static void main(String[] args) { Button buttonDemo = new Button("button123") ; // 添加监听器 buttonDemo.addButtonClickListener(new ButtonClickListener(){ @Override public void buttonClicked(ButtonClickEvent e) { e.alert(); // 获取事件源 Button source = (Button)e.getSource(); System.out.println("按钮的名称: " + source.getButtonName()); System.out.println("按钮的颜色:" + Color.getNameByIndex(source.getColorIndex())); } @Override public void changeButtonColor(ButtonClickEvent e) { System.out.println("-------------"); System.out.println("改变按钮颜色..."); Button source = (Button)e.getSource(); source.setColor(Color.Red.getIndex()); System.out.println("按钮的颜色:" + Color.getNameByIndex(source.getColorIndex())); } }); // do something // 模拟点击按钮,事件触发 buttonDemo.ButtonClick(); } }
结果:
附件:
上面例子的源代码 cjj.rar