`
yangsq
  • 浏览: 182334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中的Observer模式

阅读更多

        java语言里包含了许多对设计模式的直接支持,如command模式,agent模式,observer模式等。虽然java提供的对这些模式的支持很简单,不能满足比较复杂的应用。但在简单的场景下,使用这些类往往能够得到立杆见影的效果。所以,如果没有什么特殊需求,还是最好利用java的这些类。

        Observer模式,又称监听模式,观察者模式,是经典设计模式之一(one of GOF)。java语言中,对这种模式支持的类和接口主要有以下几个,全部来自java.beans包:

java.beans.PropertyChangeListener (interface)  

java.beans.PropertyChangeSupport  (class)

java.beans.PropertyChangeEvent (class)

  • java.beans.PropertyChangeListener

      这是一个接口,很显然,所有实现这个接口的类就是listener啦(或者叫observer),它会对被监听的对象的某些变化感兴趣。这个接口就一个方法:

java 代码
  1. public void propertyChange(PropertyChangeEvent evt) {   
  2. // TODO Auto-generated method stub   
  3. }  

接口定义很简单,作用也很明显。接受一个event(被监听者产生的PropertyChangeEvent),然后根据这个event做点反应。

  •   java.beans.PropertyChangeSupport 

         这个类用在被观察者的类里,用来保存注册的观察者,并负责向他们提供被观察者的变化信息。这个类的方法也不多,不过还是只介绍100%用到的,要不脑子就不够使了,呵呵。

java 代码
  1. public PropertyChangeSupport(Object sourceBean)  

      这是构造函数,参数就是被监听者。PropertyChangeListener一般作为被监听者的一个属性。一般如下使用:

java 代码
  1. private PropertyChangeSupport listeners = new PropertyChangeSupport(this);  

      注意,这个listeners可不是只代表一个监听者,他可能是一群监听者。那么如何这些listeners是谁呢?这回用到下面的方法了。

java 代码
  1. public void addPropertyChangeListener(PropertyChangeListener listener)  

        这个类太容易了,把监听者加进来。就像开十七大一样,记者想要采访,就得先登记一下。显然这个方法可以多次调用(add嘛)。有加就有减:

java 代码
  1. public void removePropertyChangeListener(PropertyChangeListener listener)  

如果这个监听者对被监听者的任何变化多不感兴趣了,就被被监听者赶了出去。

好了,记者都到齐了,被监听者有变化了就该通知人家了,使用如下方法的一个:

java 代码
  1. public void firePropertyChange(PropertyChangeEvent evt)   
  2.   
  3. public void firePropertyChange(String propertyName,   
  4.                                boolean oldValue,   
  5.                                boolean newValue)   
  6.   
  7. public void firePropertyChange(String propertyName,   
  8.                                int oldValue,   
  9.                                int newValue)   
  10.   
  11. public void firePropertyChange(String propertyName,   
  12.                                Object oldValue,   
  13.                                Object newValue)  

实际上,后三个方法的参数都会封装成PropertyChangeEvent,然后调用第一个方法。不过在实际中,我们还是喜欢直接调用后三个中的一个,封装的事我们就不管了。后三个方法的参数都是三个,其中的oldValue和newValue就是改变前后的值,第一个就是给改变一个名字,好让监听者们根据这个名子来做响应。就像开会,政府的所有信息都会被记者听到,但是有的记者只对台湾问题感兴趣,而有的记者对中日问题感兴趣。

对PropertyChangeSupport方法的介绍就这么多吧。注意,PropertyChangeSupport既然被用到了被观察者的类(一般是一个model)里,那么他的这些方法就只在被观察这里调用。

  • java.beans.PropertyChangeEvent

       这个类我也懒得介绍,看看他的主要方法就明白怎么回事了

java 代码
  1. public String getPropertyName()   
  2. public Object getNewValue()   
  3. public Object getOldValue()  

就者三个类,再有就是具体问题具体分析了。来个例子吧,首先是被观察者:

java 代码
  1. public class Domain{   
  2.     protected String id;   
  3.     protected String name;   
  4.     protected String desName;   
  5.   
  6.     protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);   
  7.   
  8.     public String getId() {   
  9.         return id;   
  10.     }   
  11.   
  12.     public void setId(String id) {   
  13.         this.id = id;   
  14.         firePropertyChange("Domain.id"null, id);   
  15.     }   
  16.   
  17.     public String getDesName() {   
  18.         return desName;   
  19.     }   
  20.   
  21.     public void setDesName(String desName) {   
  22.         this.desName = desName;   
  23.         firePropertyChange("Domain.desName"null, desName);   
  24.     }   
  25.   
  26.     public String getName() {   
  27.         return name;   
  28.     }   
  29.   
  30.     public void setName(String name) {   
  31.         this.name = name;   
  32.         firePropertyChange("Domain.name"null, name);   
  33.     }   
  34.   
  35.     public void addPropertyChangeListener(PropertyChangeListener listener) {   
  36.         listeners.addPropertyChangeListener(listener);   
  37.     }   
  38.   
  39.     public void firePropertyChange(String propName, Object oldValue, Object newValue) {   
  40.         listeners.firePropertyChange(propName, oldValue, newValue);   
  41.     }   
  42.   
  43.     public void removePropertyChangeListener(PropertyChangeListener listener) {   
  44.         listeners.removePropertyChangeListener(listener);   
  45.     }   
  46. }  

有人对Domain的三个属性感兴趣。下面就是这些人中的一个:

java 代码
  1. public class SimpleObserver implements PropertyChangeListener {   
  2.        
  3.     ....   
  4.        
  5.     @Override  
  6.     public void propertyChange(PropertyChangeEvent evt) {   
  7.         if(evt.getPropertyName().equals("Domain.name")){   
  8.             //do some work   
  9.         }   
  10.     }   
  11.        
  12. }  

下面是个简单的测试类:

java 代码
  1. public class SimpleTest{   
  2.     public static void main(String[] args) {   
  3.         SimpleObserver observer = new SimpleObserver();   
  4.         Domain domain = new Domain();   
  5.         domain.addPropertyChangeListener(observer);   
  6.         domain.setName("yangsq");   
  7.         ......   
  8.     }   
  9. }  

很显然,可以观察到SimpleObserver中propertyChange方法的执行。

分享到:
评论
3 楼 m4dancer 2009-02-09  
不错啊,学习。
2 楼 xiaobai1023 2008-07-02  
恩,很好,谢谢
1 楼 Jameslyy 2008-01-10  
不错,思路简单易懂!

相关推荐

    Observer模式

    Observer模式,也被称为“发布-订阅”模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Observer模式是实现...

    Observer设计模式实例

    在Observer模式中,主要有两个关键角色:Subject(主题)和Observer(观察者)。Subject维护了一个Observer的列表,并负责在状态变化时通知它们。Observer则关注Subject,当Subject状态变化时,Observer会收到通知并...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式的设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的...

    OBserver模式设计实现

    标题中的"OBserver模式设计实现"是指探讨如何在实际编程中应用观察者模式,无论是用Java还是C++。Head First系列书籍是著名的编程学习资源,以易懂的方式解释复杂的设计模式。在描述中提到的"Head First模式设计用的...

    java设计模式之Observer参考.pdf

    这样,当用户在JSP页面上操作商品的名称或价格时,实际上就是在调用`Product`类中的`setName()`和`setPrice()`方法,进而触发Observer模式中的通知机制,使得观察者能够及时得知商品状态的变更。 总的来说,...

    Observer模式代码实现

    ### Observer模式代码实现 #### 观察者模式简介 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...

    JAVA23中设计模式

    ### JAVA23中设计模式详解 #### 一、概述 设计模式是在软件设计过程中解决常见问题的一套可复用的解决方案。《JAVA23中设计模式》是一份针对Java程序员的指南,旨在通过一系列示例和理论讲解,帮助读者理解和掌握...

    java设计模式之Observer[整理].pdf

    在这个场景中,我们将讨论如何在Java中应用Observer模式,特别是在电子商务系统中的应用。 Observer模式的核心思想是定义一个一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象的状态发生变化...

    Java设计模式之观察者模式(Observer模式)介绍

    观察者模式(Observer模式)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在Java中,这个模式是通过`java.util....

    Observer模式的应用

    请选用适当的设计模式,编写一个股票行情分析软件,随着时间的推移和股票价格的变动,实现各种指标的动态更新(要求至少实现一个股票的分时图和K线图:为降低编程工作量,K线图可以用开盘价、收盘价、最高价、最低价...

    Java的23种设计模式百度云下载链接.rar

    Java中的`Observer`和`Observable`接口就是观察者模式的实现。 23. **中介者模式**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的...

    java与模式光盘源码

    《Java与模式》是阎宏博士撰写的一本经典IT著作,深入浅出地探讨了如何在Java编程中应用设计模式。这本书的光盘源码包含了书中提到的各种模式的实例代码,为读者提供了实践和理解设计模式的宝贵资源。在本文中,我们...

    Observer 模式

    在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了实现Observer模式的基础框架。主体类通常扩展`Observable`,并调用其`addObserver()`方法来注册新的观察者,`deleteObserver()`用于移除,而`...

    五种常用的Java设计模式

    下面将总结五种常用的Java设计模式,分别是单例模式、工厂模式、建造模式、_observer模式和迭代器模式。 单例模式 单例模式是一种创造型设计模式,主要目的是使内存中保持一个对象。单例模式可以保证在整个应用...

    Java 企业设计模式

    Java企业设计模式是软件开发领域中的重要组成部分,它是一套经过实践验证的解决方案,用于解决在Java环境中构建大型、复杂企业应用时常见的问题。这些模式是经验丰富的开发者们通过不断尝试和总结,形成的最佳实践,...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    Java的`Observer`和`Observable`接口实现了观察者模式。 13. **责任链模式**:避免请求的发送者和接收者之间的耦合,将多个处理者组织成链,请求沿着链传递,直到被某个处理者处理。在Java中,异常处理机制某种程度...

    23种java设计模式.pdf

    JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建模式是指在创建对象时...

    Java观察者模式代码全解析

    本文将深入解析Java中的观察者模式,并通过一个详细的代码示例来阐述其工作原理。 观察者模式的核心概念包括主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何包含可变状态的类;观察者是对...

    Java设计模式刘伟书本中模拟考试答案

    以上这些知识点是Java设计模式中非常重要的部分,掌握了这些概念和应用,对于提高软件设计和开发的质量与效率具有重要意义。在学习和应用这些模式时,需要结合具体的应用场景和需求进行灵活运用。

Global site tag (gtag.js) - Google Analytics