`

常用设计模式----观察者模式

 
阅读更多
观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

设计原则:
为了交互对象之间的松耦合设计而努力。


java中内置的观察者模式:
java.util.Observer(接口)和java.util.Observable(类,这也正是其局限性,不能有效的扩展(比如已经extends其他类的情况下))
--------------------------
以下是对util中的Observable的改进:
//抽象出一层
public interface IObservable {
    //注册观察者
    void addObserver(Observer o);
    //取消注册
    void deleteObserver(Observer o);
    //通知观察者们(拉的形式)
    void notifyObservers();
    //推的形式
    void notifyObservers(Object arg);
}

//可观察者对象的实现
class Observable implements IObservable{
 private boolean changed = false;
 private List<Observer> obs;

 public Observable() {
  obs = new ArrayList<Observer>();
 }
 public synchronized void addObserver(Observer o) {
  if (o == null)
   throw new NullPointerException();
  if (!obs.contains(o)) {
   obs.add(o);
  }
 }

 public synchronized void deleteObserver(Observer o) {
  obs.remove(o);
 }

 public void notifyObservers() {
  notifyObservers(null);
 }
 public void notifyObservers(Object arg) {
  Object[] arrLocal;

  synchronized (this) {
   if (!changed)
    return;
   arrLocal = obs.toArray();
   clearChanged();
  }

  for (int i = arrLocal.length - 1; i >= 0; i--)
   ((Observer) arrLocal[i]).update(this, arg);
 }

 public synchronized void deleteObservers() {obs.clear();}
 protected synchronized void setChanged()   {changed = true;}
 protected synchronized void clearChanged() {changed = false;}
 public synchronized boolean hasChanged()   {return changed;}
 public synchronized int countObservers()   {return obs.size();}
}

//观察者需要实现统一的接口
interface IObserver {
    void update(IObservable o, Object arg);
}

//观察者实现类
class Observer implements IObserver {
 private IObservable obs;

 public Observer(IObservable obs) {
  this.obs = obs;
  obs.addObserver(this);
 }

 @Override
 public void update(IObservable o, Object arg) {
  //观察者自己的更新方法
        //...
 }
}

//新建一个主题对象,传递到新建的观察者对象中。调用主题对象的notify 就会触发观察者对象了。


-观察者模式定义了对象之间的一对多的关系。
-主题(也就是可观察者)用一个共同的接口来更新观察者。
-观察者和可观察者(主题)之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
-使用该模式时,可以从被观察者处推(push)或拉(pull)数据(不过,推的方式比较推崇)。
-有多个观察者时不可以依赖特定的通知次序。
-Java有多种观察者模式的实现,包括通用的java.util.Observalbe。
-许多UI框架比如SWT等的添加监听器的行为 都是观察者模式的实现。
分享到:
评论

相关推荐

    java常用设计模式-观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。该模式适用于需要在对象间建立动态的、松散耦合的关系的...

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(...观察者模式(Observer Pattern)、责任链模式(Chain of Responsibility Pattern)、访问者模式(Visitor Pattern)、状态模式(State ...

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    常用设计模式demo代码-design.rar

    下面我们将深入探讨标题和描述中提到的四种设计模式:单例模式、工厂模式、观察者模式以及模板模式。 1. **单例模式**: 单例模式是一种限制类实例化次数为一次的设计模式,确保在整个应用程序中只有一个实例存在...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...

    Unity3D设计模式之观察者模式

    ### Unity3D设计模式之...观察者模式是Unity3D等游戏开发中常用的设计模式之一,它能够帮助我们更好地组织代码、提高代码的可维护性和扩展性。通过合理的设计和实现,可以充分发挥观察者模式的优势,避免其潜在的问题。

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    - **观察者**(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **状态**(State):允许一个对象在其内部状态改变时改变它的行为。 - **...

    java常用23中设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    Jjava常用设计模式

    在这个Java常用设计模式的文档中,我们将深入探讨以下几种模式:单例模式、工厂模式、策略模式以及观察者模式。 **单例模式**是一种限制类实例化次数的模式,确保一个类只有一个实例,并提供一个全局访问点。在Java...

    常用设计模式及Java程序 pdf

    ### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

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

    .NET 23种常用设计模式

    ### .NET 23种常用设计模式 #### 概述 设计模式是在软件工程领域内被广泛采用的一种软件设计思路,旨在解决特定类型的问题。在.NET框架中,这些设计模式同样适用并能帮助开发者构建更加灵活、可扩展及易于维护的...

    23常用设计模式的UML

    这个压缩包文件"23常用设计模式的UML"提供了23个经典设计模式的统一建模语言(UML)表示,这对于理解和应用这些模式至关重要。 首先,我们要了解UML是一种标准化的图形表示法,用于系统分析、设计和建模。它通过...

    设计模式之观察者模式.pdf

    观察者模式(Observer Pattern)是一种常用的行为设计模式,它允许对象之间建立一种一对多的关系,即多个对象可以监听一个对象的状态变化,当这个对象的状态发生改变时,所有相关的对象(观察者)都会收到通知并自动...

    Java常用设计模式

    以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...

    JAVA常用设计模式.ppt

    设计模式的应用不仅限于上述几种,还包括适配器模式、装饰器模式、观察者模式、责任链模式、命令模式、迭代器模式、访问者模式、模板方法模式等。它们都是软件设计的宝贵工具,帮助我们写出更优雅、可复用的代码。...

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

    12. **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Java的`Observer`和`Observable`接口实现了观察者模式。 13. **责任链模式**:...

Global site tag (gtag.js) - Google Analytics