快速业务通道

利用Observer模式实现组件间通信 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
bserver该subject状态发生变化

4.Observer模式在Java GUI事件模型中应用 

其实在AWT/Swing事件模型中用到了好几种设计模式,以前的JDK 1.0 AWT使用的是“基于继承的事件模型”,在该模型Component类中定义了一系列事件处理方法,如:handleEvent,mouseDown,mouseUp等等,我们对事件的响应是通过对组件类继承并覆盖相应的事件处理方法的手段来实现,这种模型有很多缺点,事件的处理不应当由事件产生者负责,而且根据“设计模式”一书中的原则,“继承”通常被认为是“对封装性的破坏”,父子类之间的紧密耦合关系降低了灵活性,同时继承容易导致家族树规模的庞大,这些都不利于组件可重用。

JDK 1.1以后新的事件模型是被成为“基于授权的事件模型”,也就是我们现在所熟悉的Listener模型,事件的处理不再由产生事件的对象负责,而由Listener负责。尤其在Swing组件中设计MVC结构时用到了Observer模式,众所周知,MVC表示“模型-视图-控制器”,即“数据-表示逻辑-操作”,其中数据可以对应多种表示,这样视图就处在了observer的地位,而model则是subject。

利用Observer模式实现组件间通信(3)

时间:2010-12-03

5.简单的例子

回到本文一开始的那个Explorer的例子,我们考虑做一个简单的图片浏览器,使树型选择组件和图片浏览面板在两个不同的类中,其中图片浏览面板根据所选择的树的节点显示相应的图片,所以图片浏览面板是一个observer,树是subject。由于Java单根继承的原因,我们不能同时继承JPanel和Observable,但可以用对象的组合把一个subject放到我们的类当中,并通过TreeSelectionListener触发subject的setChanged方法,并通过notifyObservers方法通知observer。

例子代码如下:

//LeftPanel.java package com.jungleford.test; import java.awt.BorderLayout; import javax.swing.*; import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.tree.DefaultMutableTreeNode; import java.util.Observable; import java.util.Observer; public final class LeftPanel extends JPanel {// 把树型选择视图布局在左边    private JTree tree;// 树型选择视图    private JScrollPane scroll;// 让视图可滚动    private DefaultMutableTreeNode root, node1, node2;// 根节点及两个叶子    private Sensor sensor;// sensor是一个Observable,由于只能单根继承,所以作为组合成员    private String file;// 图片文件名,与RightPanel通信的内容    public LeftPanel(Observer observer)    {      file = "";      sensor = new Sensor();      sensor.addObserver(observer);// 向Observable注册Observer      root = new DefaultMutableTreeNode("Images");      tree = new JTree(root);      node1 = new DefaultMutableTreeNode("Rabbit");      node2 = new DefaultMutableTreeNode("Devastator");      root.add(node1);      root.add(node2);      tree.addTreeSelectionListener(new TreeSelectionListener()      {// 树节点选择动作         public void valueChanged(TreeSelectionEvent e)        {          Object obj = e.getPath().getLastPathComponent();          if (obj instanceof DefaultMutableTreeNode)          {  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号