知识大全 爪哇语言观察者模式介绍

Posted

篇首语:行为决定性格,性格决定命运。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 爪哇语言观察者模式介绍相关的知识,希望对你有一定的参考价值。

  简单地说 观察者模式定义了一个一对多的依赖关系 让一个或多个观察者对象监察一个主题对象 这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象 使这些观察者对象能够自动更新   观察者模式的结构  观察者(Observer)模式是对象的行为型模式 又叫做发表 订阅(Publish/Subscribe)模式 模型 视图(Model/View)模式 源 收听者(Source/Listener)模式或从属者(Dependents)模式   本模式的类图结构如下       图 观察者模式的静态结构可从类图中看清楚    在观察者模式里有如下的角色    抽象主题(Subject)角色 主题角色把所有的观察者对象的引用保存在一个列表里 每个主题都可以有任何数量的观察者 主题提供一个接口可以加上或撤销观察者对象 主题角色又叫做抽象被观察者(Observable)角色       图 抽象主题角色 有时又叫做抽象被观察者角色 可以用一个抽象类或者一个接口实现 在具体的情况下也不排除使用具体类实现     抽象观察者(Observer)角色 为所有的具体观察者定义一个接口 在得到通知时更新自己       图 抽象观察者角色 可以用一个抽象类或者一个接口实现 在具体的情况下也不排除使用具体类实现     具体主题(ConcreteSubject)角色 保存对具体观察者对象有用的内部状态 在这种内部状态改变时给其观察者发出一个通知 具体主题角色又叫作具体被观察者角色      图 具体主题角色 通常用一个具体子类实现    .具体观察者(ConcreteObserver)角色 保存一个指向具体主题对象的引用 和一个与主题的状态相符的状态 具体观察者角色实现抽象观察者角色所要求的更新自己的接口 以便使本身的状态与主题的状态自恰      图 具体观察者角色 通常用一个具体子类实现    下面给出一个示意性实现的Java代码 首先在这个示意性的实现里 用一个Java接口实现抽象主题角色 这就是下面的Subject接口   public interface Subject    public void attach(Observer observer);  public void detach(Observer observer);  void notifyObservers();    代码清单 Subject接口的源代码   这个抽象主题接口规定出三个子类必须实现的操作 即 attach() 用来增加一个观察者对象 detach() 用来删除一个观察者对象 和notifyObservers() 用来通知各个观察者刷新它们自己 抽象主题角色实际上要求子类保持一个以所有的观察者对象为元素的列表   具体主题则是实现了抽象主题Subject接口的一个具体类 它给出了以上的三个操作的具体实现 从下面的源代码可以看出 这里给出的Java实现使用了一个Java向量来保存所有的观察者对象 而 attach() 和 detach() 操作则是对此向量的元素增减操作   import java util Vector;  import java util Enumeration;  public class ConcreteSubject implements Subject  public void attach(Observer observer)    observersVector addElement(observer);    public void detach(Observer observer)    observersVector removeElement(observer);    public void notifyObservers()    Enumeration enumeration = observers();  while (enumeration hasMoreElements())    ((Observer)enumeration nextElement()) update();      public Enumeration observers()    return ((Vector) observersVector clone()) elements();    private Vector observersVector = new java util Vector();    代码清单 ConcreteSubject类的源代码   抽象观察者角色的实现实际上是最为简单的一个 它是一个Java接口 只声明了一个方法 即update() 这个方法被子类实现后 一被调用便刷新自己   public interface Observer    void update();     代码清单 Observer接口的源代码   具体观察者角色的实现其实只涉及update()方法的实现 这个方法怎么实现与应用密切相关 因此本类只给出一个框架   public class ConcreteObserver implements Observer    public void update()    // Write your code here       代码清单 ConcreteObserver类的源代码   虽然观察者模式的实现方法可以有设计师自己确定 但是因为从AWT 开始视窗系统的事件模型采用观察者模式 因此观察者模式在Java语言里的地位较为重要 正因为这个原因 Java语言给出了它自己对观察者模式的支持 因此 本文建议读者在自己的系统中应用观察者模式时 不妨利用Java语言所提供的支持   Java语言提供的对观察者模式的支持  在Java语言的java util库里面 提供了一个Observable类以及一个Observer接口 构成Java语言对观察者模式的支持   Observer接口  这个接口只定义了一个方法 update() 当被观察者对象的状态发生变化时 这个方法就会被调用 这个方法的实现应当调用每一个被观察者对象的notifyObservers()方法 从而通知所有的观察对象      图 java util提供的Observer接口的类图    package java util;  public interface Observer    /**  * 当被观察的对象发生变化时 这个方法会被调用   */  void update(Observable o Object arg);    代码清单 java util Observer接口的源代码   Observable类  被观察者类都是java util Observable类的子类 java util Observable提供公开的方法支持观察者对象 这些方法中有两个对Observable的子类非常重要 一个是setChanged() 另一个是notifyObservers() 第一个方法setChanged()被调用之后会设置一个内部标记变量 代表被观察者对象的状态发生了变化 第二个是notifyObservers() 这个方法被调用时 会调用所有登记过的观察者对象的update()方法 使这些观察者对象可以更新自己   java util Observable类还有其它的一些重要的方法 比如 观察者对象可以调用java util Observable类的addObserver()方法 将对象一个一个加入到一个列表上 当有变化时 这个列表可以告诉notifyObservers()方法那些观察者对象需要通知 由于这个列表是私有的 因此java util Observable的子对象并不知道观察者对象一直在观察着它们      图 Java语言提供的被观察者的类图    被观察者类Observable的源代码   package java util;  public class Observable    private boolean changed = false;  private Vector obs;  /** 用 个观察者构造一个被观察者 **/    public Observable()    obs = new Vector();    /**  * 将一个观察者加到观察者列表上面   */  public synchronized void addObserver(Observer o)    if (!ntains(o))    obs addElement(o);      /**  * 将一个观察者对象从观察者列表上删除   */  public synchronized void deleteObserver(Observer o)    obs removeElement(o);    /**  * 相当于 notifyObservers(null)  */  public void notifyObservers()    notifyObservers(null);    /**  * 如果本对象有变化(那时hasChanged 方法会返回true)  * 调用本方法通知所有登记在案的观察者 即调用它们的update()方法   * 传入this和arg作为参量   */  public void notifyObservers(Object arg)    /**  * 临时存放当前的观察者的状态 参见备忘录模式   */  Object[] arrLocal;  synchronized (this)    if (!changed) return;  arrLocal = obs toArray();  clearChanged();    for (int i = arrLocal length ; i>= ; i )  ((Observer)arrLocal[i]) update(this arg);    /**  * 将观察者列表清空  */  public synchronized void deleteObservers()    obs removeAllElements();    /**  * 将 已变化 设为true  */  protected synchronized void setChanged()    changed = true;    /**  * 将 已变化 重置为false  */  protected synchronized void clearChanged()    changed = false;    /**  * 探测本对象是否已变化  */  public synchronized boolean hasChanged()    return changed;    /**  * 返还被观察对象(即此对象)的观察者总数   */  public synchronized int countObservers()    return obs size();      代码清单 cha138/Article/program/Java/gj/201311/27487

相关参考

知识大全 爪哇语言工厂方法创立性模式介绍(上)

  正如同笔者在一节里介绍的工厂模式有简单工厂模式工厂方法模式和抽象工厂模式几种形态简单工厂模式已经在前面作过介绍在简单工厂模式中一个工厂类处于对产品类实例化调用的中心位置上它决定那一个产品类应当被实

知识大全 爪哇语言工厂方法创立性模式介绍(下)

  packagejavapatternsfactorymethod;    publicclassBadPlantExceptionextendsException     publicBadPla

知识大全 爪哇语言结构性模式之变压器模式介绍(上)

  什么是结构性模式  结构性模式描述类和对象怎样结合在一起成为较大的结构结构性模式描述两种不同的东西类与类的实例根据它们所描述的东西的不同结构性模式可以分为类结构模式和实例结构模式两种  类结构模式

知识大全 爪哇语言结构性模式之变压器模式介绍(下)

  抽象类WindowAdapter是变压器模式的一个例子  抽象类WindowAdapter是为接受视窗的事件而准备的此抽象类内所有的方法都是空的使用此类可以很方便地创立listener对象置换(O

知识大全 爪哇语言单态创立性模式介绍(下)

  登记式单态类  登记式单态类是GoF为了克服饿汉式单态类及懒汉式式单态类均不可继承的缺点而设计的作者把他们的例子翻译为爪哇语言并将它自己实例化的方式从懒汉式改为饿汉式只是它的子类实例化的方式只能是

知识大全 观察者模式 - 设计模式

  观察者模式定义了一个一对多的对象关系一个主体对象对应多个观察者对象当主体对象发生改变时所有它对应的观察者对象都会自动得到通知并更新  本文将给出一个相应的事例具体说明观察者模式是如果工作的这个事例

知识大全 设计模式-快餐简解-观察者模式

  【观察者模式应用场景举例】  比如在玩极品飞车这款游戏每一个车手到达终点的时候都会在其它车手的屏幕上显示某某人以多少时间到达终点的提示其实这就是一个典型的观察者模式的应用观察者模式即是典型的双向一

知识大全 java 设计模式之 观察者模式(Observer)

java设计模式之观察者模式(Observer)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 开发设计模式——asp.net中实现观察者模式

   在中实现观察者模式?难道中的观察者模式有什么特别么?嗯基于Http协议的Application难免有些健忘我是这样实现的不知道有没有更好的办法?  先谈谈需求吧以免

知识大全 php设计模式之观察者模式的应用详解

 代码如下:<?php//抽象主题interfaceSubjectpublicfunctionattach($observer);publicfunctiondetach($obser