第一次上了关于事件监听模式的课之后,就开始使用了这种模式来编写Netalk 客户端,以前的方法继续扩展非常困难,类之间的耦合越来越高,代码也变得混乱。
事件模式就是定义一个事件监听器(MsgListener)的接口,再编写类来继承界面上所使用的组件(JTree、DefaultMutableTreeNode等),并实现事件监听器接口,而通信线程所收到的信息都作为事件,调用MsgListener中的onMsg()的方法来处理。
这样使通信线程与聊天界面之间的通信变为单向调用。
但第一次使用这种方法时还是跳入了另一个死圈,想到了事件监听器接口,却没细究如何使用。而是让UI类实现了事件监听器接口,这样可以基本实现功能,也可以继续扩展,但是代码还是集中在UI类中,处理各种信息的代码也使得程序很臃肿。
通信线程收到服务器的信息并解析后(避免花费大量时间在事件监听器队列遍历的过程中,某些信息只需要某个监听器来响应),传递给UI的信息是多样的,虽然传递的都是字符串。
这些消息都可以放在一个Msg对象中。界面上响应信息的组件也是不一样的。定义自定义的组件类 class ……extends (组件类) emplements MsgListener,在根据对应的功能重写onMsg(Msg msg)方法。然后将构建的MsgListener对象添加到线程中的事件监听器队列中。这样通信线程只需要调用MsgListener中的onMsg(Msg msg)的方法就可以。
这样可以使程序更灵活,降低类之间的耦合度,也使程序更容易扩展。