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

陈小我01

陈小我01

2016-02-19 14:30

下面,图老师小编带您去了解一下利用Observer模式实现组件间通信,生活就是不断的发现新事物,get新技能~
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模式的结构:
  
  
  其中各元素的含义如下: 
  
  Subject:被观察的目标的抽象接口,它提供对观察者(Observer)的注册、注销服务,Notify方法通知Observer目标发生改变; 
  Object:观察者的抽象接口,Update方法是当得到Subject状态变化的通知后所要采取的动作; 
  ConcreteSubject:Subject的具体实现; 
  ConcreteObserver:Observer的具体实现 
  Observer模式在实现MVC结构时非常有用,为数据和数据表示解耦合。
  
  进入讨论组讨论。   3. Java中的Observer模式:Observer和Observable 
  
  !-- frame contents -- !-- /frame contents --  在大致了解了Observer模式的描述之后,现在我们更为关心的是它在Java中是如何应用的。幸运的是,自从JDK 1.0起,就有了专门处理这种应用的API,这就是Observer接口和Observable类,它们是属于java.util包的一部分。看来Java的开发者们真是深谙设计模式的精髓,而Java的确是为了真正的面向对象而生的,呵呵!
  
  这里的Observer和Observable分别对应设计模式中的Observer和Subject,对比一下它们定义的方法,痕迹还是相当明显的:
  
  Observer的方法: 
  
  update(Observable subject, Object arg) 监控subject,当subject对象状态发生变化时Observer会有什么响应,arg是传递给Observable的notifyObservers方法的参数; 
  
  Observable的方法:
  
  addObserver(Observer observer) observer向该subject注册自己 
  
  hasChanged() 检查该subject状态是否发生变化 
  
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
利用Observer模式实现组件间通信

在.NET中利用委托实现窗体间通信

Web开发
在.NET中利用委托实现窗体间通信

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Android 进程间通信实现原理分析

编程语言 网络编程
Android 进程间通信实现原理分析

Observer模式深度探索

Web开发
Observer模式深度探索

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

利用iframe实现ajax跨域通信的实现原理(图解)

Web开发
利用iframe实现ajax跨域通信的实现原理(图解)

利用Winsock控件实现局域网通信

编程语言 网络编程
利用Winsock控件实现局域网通信

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win7/Win8/win8.1升级Win10后系统没有声音的解决办法

Win7/Win8/win8.1升级Win10后系统没有声音的解决办法

使用ActionHandler进行WEB应用编程

使用ActionHandler进行WEB应用编程
下拉加载更多内容 ↓