选择显示字体大小

利用observer模式实现组件间通信

  1. 问题的提出 

  以前做一个界面的时候常常会遇到这样的尴尬情况:希望保留各个独立的组件(类),但又希望它们之间能够相互通信。譬如windows中的explorer,我们希望鼠标点击左边是树型目录的一个节点,右边的文件浏览能及时列出该节点目录下的文件和子目录,类似这样一个简单的应用,如果只有一个类继承jframe,而树型组件和浏览文件的面板作为成员,就像:

public class mainframe extends jframe
{
  jpanel treepanel;
  jtree tree;
  jpanel filepanel;
  ...
}


  这样当然容易在两者之间传递消息,但是可扩展性较差。通常容易想到的是两种办法:在一个组件里保留另一个组件类型的成员,初始化时作为参数传入引用,比如:

class treepanel extends jpanel
{
  jtree tree;
  ...
}

class filepanel extends jpanel
{
  public filepanel(jtree tree){...}
  ...
}

  或者将一个组件线程化,不停地监听另一个组件的变化,然后作出相应的反映,比如:

class treepanel extends jpanel
{
  jtree tree;
  ...
}

class filepanel extends jpanel implements runnable
{
  public void run()
  {
    while (true)
    {
      //监听tree的变化 
    }
    ...
  }
  ...
}

  这样确实可以达到我们的目的,但是第一种方案显然不利于松散耦合,第二种方案比较占用系统资源。通过学习设计模式,我们发现可以用observer模式来解决这个问题。

  2. observer模式 

  设计模式分为创建型、结构型和行为型,其中行为型模式专门处理对象间通信,指定交互方式等,observer模式就是属于行为型的一种设计模式。按照“四人帮”(gang of four)在“design patterns”里的定义,observer模式“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新”,这个描述正好符合我们对“组件通信”问题的需求。让我们先看看observer模式的结构:


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范