事件监听机制的设计模式叫观察者模式,也叫订阅模式。
监听机制是这样的,swing的组件可以发起(触发)一个事件。这个事件被发起时,它将被一个或多个监听器接收并处理。所以,事件的发生可以和事件的处理相分离,从而降低耦合,这是一个分离接口和实现的极佳的例子。
让我们看看一个事件监听机制中的角色:
n 组件 ——v 发起 —— n 事件
n 监听器 ——v 接受and处理——n 事件
组件:是发起事件的具体类。监听器:是接收和处理事件的具体类。所以,事件的发生可以和事件的处理相分离。
对应到观察者模式中来:
观察者 < —— ——> 被具体监听器实现的那个类,这是一个接口。对应于 java.awt.event里面的全部接口
具体观察者 < —— ——> 具体监听器 XXXListener 。对应于 java.awt.event里面的部分类,因为还有一部分类是继承了抽象类
目标 < —— ——> 组件的父类,这是一个抽象类。对应于javax.swing里面的部分抽象类。
具体目标 < —— ——> 组件类。对应于所有组件类。
如何为一个组件注册监听器?
1 创建一个组件对象。
2 创建一个监听器类(建议这个类是一个匿名内部类,因为它含有其外部类对象的引用,这就为跨越类和子系统边界的调用提供了一种优雅的方式),唯一的要求是实现相应的监听器接口,然后实现里面的方法(也就是对事件处理逻辑)。最后创建本类对象便创建了一个具体的监听器。
3 用组件上的addXXXListener()方法给自己注册一个或几个(2)中创建的监听器对象。
一个组件可以注册多个不同类型的监听器。
联系事件监听机制,我们可以发现观察者模式的使用场合:
1.当一个抽象模型(事件监听模型)有两个方面(组件和监听器),其中一个方面依赖于另一方面。 将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象(组件对象)的改变需要同时改变其它对象(监听器对象),而不知道其它对象具体有几中、几个对象有待改变。