观察者模式

观察者模式

本文参考http://tianli.blog.51cto.com/190322/40455的内容,简要介绍了观察者模式。

在一个公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。

观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。该模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。这种交互也称为发布-订阅模式,目标是通知的发布者,它发出通知时并不需要知道谁是它的观察着,可以有任意数量的观察者订阅并接受通知。以下代码采用Java语言描述。

//Subject.java文件

public interface Subject

{

   public void attach(Observer DocExplorer);

   public void detach(Observer DocExplorer);

   void notifyObservers();

}

 

//Observer.java文件

public interface Observer

{

    //观察者对象更新自身的状态,更新的数据应该来自目标对象

    void updata(Subject subject);

}

 

//OfficeDoc.java文件

import java.util.*;

public class OfficeDoc implements Subject

{

    //OfficeDoc类实现Subject接口

    //存储与OfficeDoc相关联的DocExplorer对象

    private Vector ObserverVector=new java.util.Vector();

   

    public void attach(Observer observer)

    {

       //将某DocExplorer对象与OfficeDoc相关联

       ObserverVector.addElement(observer);

}

public void detach(Observer observer)

{

    //解除某DocExplorer对象与OfficeDoc的关联关系

    ObserverVector.removeElement(observer);

}

public void notifyObservers()

{

    //当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象

    //notifyObservers方法通知所有的观察者对象更新自身的状态,

    //此处应该返回所有的观察者对象,调用Observers()即可获得

    Enumeration enumeration=Observers();

    while(enumeration.hasMoreElements())

    {

       //对每个观察者对象更新状态,调用updata

       //update方法需要此目标对象作为参数,

       //所以,使用this来获取对象自身。

       ((Observer)enumeration.nextElement()).updata(this);

}

}

public Enumeration Observers()

{

    return ObserverVector.elements();

}

……//其它公文类的属性和方法省略

}

 

//DocExplorer.java文件

public class DocExplorer implements Observer

{

    //DocExplorer是观察者,需要实现接口Observer

    //观察者对象更新自身的状态,更新的数据应该来自目标对象

    public void updata(Subject subject)

    {

       //更新DocExplorer自身的状态,代码省略

}

}

还有一个例子,老师有电话号码,学生需要知道老师的电话号码以便有问题可以随时取得联系,此时,老师就是一个被观察者即目标(Subject),学生就是观察者(Observer),当老师的电话号码发生改变时,学生得到通知,并更新相应的电话号码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值