第一节中的示例过于简单《》簡单到让大家觉得这样的代码简直毫无用处。但是没办法我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码
我们要說java事件处理机制驱动模型是观察者模式的升级版本,那我们就要说说其中的对应关系:
观察者对应监听器(学生)
被观察者对应java事件处理機制源(教师)
java事件处理机制源产生java事件处理机制java事件处理机制带有java事件处理机制源,监听器监听java事件处理机制爱钻牛角尖的朋友可能会说,我擦什么叫产生java事件处理机制,监听java事件处理机制java事件处理机制java事件处理机制到底什么?
莫慌如果我们用代码来说事,java事件处理机制它就是个类java事件处理机制源也是个类。这里面一共牵扯到四个类java事件处理机制源(即教师、即被观察者)、java事件处理机制(是一个类,见下文一般我们以Event或者EventObject命名结尾)、监听器接口、具体的监听器(即学生、即观察者)。
就像我们上一篇文章中的第一节提到的一样JDK中当然有现成的java事件处理机制模型类,我们不妨来一个一个的查看一下吧
首先看监听器(即学生、即观察者,大家不要嫌峩烦不停滴括号提醒,这是为了不停滴给大家加深印象)
简单到不能再简单了,对吧甚至连一个声明的方法都没有,那它存在的意義在哪还记得面向对象中的上溯造型吗,所以它的意义就在于告诉所有的调用者我是一个监听器。
再来看看java事件处理机制即Event或EventObject结尾嘚那个类,里面含有getSource方法返回的就是java事件处理机制源(即教师、即被观察者),
这个类也很简单如果说观察者模式中的上层类和结果還带了不少逻辑不少方法的话,那么java事件处理机制驱动模型中的上层类和接口简直看不到任何东西没错,
java事件处理机制驱动模型中JDK的設计者们进行了最高级的抽象,就是让上层类只是代表了:我是一个java事件处理机制(含有java事件处理机制源)或,我是一个监听者!
二:咾师布置作业的java事件处理机制驱动模型版本
老规矩让我们先给出类图:
观察者接口(学生)。由于在java事件处理机制驱动模型中只有一個没有任何方法的接口,EventListener所以,我们可以先实现一个自己的接口为了跟上一篇的代码保持一致,在该接口中我们声明的方法的名字也叫update注意,我们当然也可以不取这个名字甚至还可以增加其它的方法声明,全看我们的业务需要
继而实现观察者类(学生),如下:
對比一下上篇有变动没?
继而实现java事件处理机制子类如下:
在这个类中,指的关注的就是这个getTeacher方法它封装了父类EventObject的getSource方法,得到了java事件处理机制源理论上,我们使用父类的getSource方法也可行但是重新在子类封装一下,可读性更强一点
然后呢,然后就是我们的教师类教師类就是java事件处理机制源,如下:
这个类稍微长了那么一点点有几个地方值得注意:
第一处地方,Teacher没有父类了Teacher作为java事件处理机制中的java倳件处理机制源Source被封装到HomeworkEventObject中了。这没有什么不好的业务对象和框架代码隔离开来,解耦的非常好但是正因为如此,我们需要在Teacher中自己維护一个Student的列表于是,我们看到了homeworkListenerList这个变量
第二处,在观察者模式中我们直接调用Observable的notifyObservers来通知被观察者,现在我们只能靠自己了于昰我们看到了这段代码,
这一点问题也没有我们继续来看客户端代码吧:
从客户端的角度来说,我们几乎完全没有更改任何地方跟观察者模式的客户端代码一模一样,但是内部的实现机制上我们却使用了java事件处理机制机制。
现在我们来总结下观察者模式和java事件处理機制驱动模型的几个不同点:
1:java事件处理机制源不再继承任何模式或者模型本身的父类,彻底将业务代码解耦出来;
2:在java事件处理机制模型中每个监听者(观察者)都需要实现一个自己的接口。没错看看我们的鼠标java事件处理机制,分表就有单击、双击、移动等等的java事件處理机制这分别就是增加了代码的灵活性;
不管怎么说,我们用一堆小白代码实现了一个java事件处理机制驱动模型的样例虽然没什么实際用处,但也解释了原理接下来的一节,我们就要看看那些稍微复杂且看上去很有用的代码了!