`
lvwenwen
  • 浏览: 955591 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

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 代码
public void propertyChange(PropertyChangeEvent evt) {  
// TODO Auto-generated method stub  

接口定义很简单,作用也很明显。接受一个event(被监听者产生的PropertyChangeEvent),然后根据这个event做点反应。
  java.beans.PropertyChangeSupport
         这个类用在被观察者的类里,用来保存注册的观察者,并负责向他们提供被观察者的变化信息。这个类的方法也不多,不过还是只介绍100%用到的,要不脑子就不够使了,呵呵。
java 代码
public PropertyChangeSupport(Object sourceBean) 
      这是构造函数,参数就是被监听者。PropertyChangeListener一般作为被监听者的一个属性。一般如下使用:
java 代码
private PropertyChangeSupport listeners = new PropertyChangeSupport(this); 
      注意,这个listeners可不是只代表一个监听者,他可能是一群监听者。那么如何这些listeners是谁呢?这回用到下面的方法了。
java 代码
public void addPropertyChangeListener(PropertyChangeListener listener) 
        这个类太容易了,把监听者加进来。就像开十七大一样,记者想要采访,就得先登记一下。显然这个方法可以多次调用(add嘛)。有加就有减:
java 代码
public void removePropertyChangeListener(PropertyChangeListener listener) 
如果这个监听者对被监听者的任何变化多不感兴趣了,就被被监听者赶了出去。
好了,记者都到齐了,被监听者有变化了就该通知人家了,使用如下方法的一个:
java 代码
public void firePropertyChange(PropertyChangeEvent evt)  
 
public void firePropertyChange(String propertyName,  
                               boolean oldValue,  
                               boolean newValue)  
 
public void firePropertyChange(String propertyName,  
                               int oldValue,  
                               int newValue)  
 
public void firePropertyChange(String propertyName,  
                               Object oldValue,  
                               Object newValue) 
实际上,后三个方法的参数都会封装成PropertyChangeEvent,然后调用第一个方法。不过在实际中,我们还是喜欢直接调用后三个中的一个,封装的事我们就不管了。后三个方法的参数都是三个,其中的oldValue和newValue就是改变前后的值,第一个就是给改变一个名字,好让监听者们根据这个名子来做响应。就像开会,政府的所有信息都会被记者听到,但是有的记者只对台湾问题感兴趣,而有的记者对中日问题感兴趣。
对PropertyChangeSupport方法的介绍就这么多吧。注意,PropertyChangeSupport既然被用到了被观察者的类(一般是一个model)里,那么他的这些方法就只在被观察这里调用。
java.beans.PropertyChangeEvent
       这个类我也懒得介绍,看看他的主要方法就明白怎么回事了
java 代码
public String getPropertyName()  
public Object getNewValue()  
public Object getOldValue() 
就者三个类,再有就是具体问题具体分析了。来个例子吧,首先是被观察者:
java 代码
public class Domain{  
    protected String id;  
    protected String name;  
    protected String desName;  
 
    protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);  
 
    public String getId() {  
        return id;  
    }  
 
    public void setId(String id) {  
        this.id = id;  
        firePropertyChange("Domain.id", null, id);  
    }  
 
    public String getDesName() {  
        return desName;  
    }  
 
    public void setDesName(String desName) {  
        this.desName = desName;  
        firePropertyChange("Domain.desName", null, desName);  
    }  
 
    public String getName() {  
        return name;  
    }  
 
    public void setName(String name) {  
        this.name = name;  
        firePropertyChange("Domain.name", null, name);  
    }  
 
    public void addPropertyChangeListener(PropertyChangeListener listener) {  
        listeners.addPropertyChangeListener(listener);  
    }  
 
    public void firePropertyChange(String propName, Object oldValue, Object newValue) {  
        listeners.firePropertyChange(propName, oldValue, newValue);  
    }  
 
    public void removePropertyChangeListener(PropertyChangeListener listener) {  
        listeners.removePropertyChangeListener(listener);  
    }  

有人对Domain的三个属性感兴趣。下面就是这些人中的一个:
java 代码
public class SimpleObserver implements PropertyChangeListener {  
      
    ....  
      
    @Override 
    public void propertyChange(PropertyChangeEvent evt) {  
        if(evt.getPropertyName().equals("Domain.name")){  
            //do some work  
        }  
    }  
      

下面是个简单的测试类:
java 代码
public class SimpleTest{  
    public static void main(String[] args) {  
        SimpleObserver observer = new SimpleObserver();  
        Domain domain = new Domain();  
        domain.addPropertyChangeListener(observer);  
        domain.setName("yangsq");  
        ......  
    }  

很显然,可以观察到SimpleObserver中propertyChange方法的执行。
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    (行为型模式) Observer 观察者模式

    ### (行为型模式) Observer 观察者模式 #### 概述 观察者模式是一种行为设计模式,它定义了一种一对多的关系,让多个观察对象同时监听某一个主题对象。当主题对象发生变化时,所有观察者对象都会收到通知并进行...

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    设计模式之略见一斑(Observer观察者模式)

    本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...

    设计模式之观察者模式(Observer Pattern)

    "ObserverPattern(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...

    android Observer(观察者模式)_案例祥解.pdf

    观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足无穷。本文将详细讲解观察者模式的概念和实现,通过代码注释来解释各个组件的作用。 一、观察者模式的定义 观察者模式是...

    C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例

    本文实例讲述了C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题。分享给大家供大家参考,具体如下: 一.理论定义 观察者模式 描述了 一种 一对多的关系。 当某一对象的状态发生改变时,其他对象会得到 改变的...

    设计模式C++学习之观察者模式(Observer)

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

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    观察者模式Observer

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

    观察者模式(Observer)

    观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中扮演着重要角色,尤其是在事件驱动编程和发布/订阅系统中。...

    观察者模式(Observer)

    观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中广泛应用于事件驱动编程,例如用户界面组件的交互或者系统状态的...

    观察者模式,Observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

Global site tag (gtag.js) - Google Analytics