java设计模式之观察者模式

观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和复用都带来不便。观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。

  观察者模式是实际中应用比较广泛的模式,其应用场景比如,一台生产大米的工厂,和n个销售大米的商家,n个商家首先在这个工厂注册一下自身的联系方式,当工厂生产出一定量的大米后,再依照联系方式通知这n个商家来取货。这个例子当中用到了观察者模式中的注册(Attach)和通知(Notify),即当通知者的状态改变时,依次通知各个观察者。

  Subject是抽象通知者,Observer是抽象观察者。如果要创建的派生类是风马牛不相及的对象,可以考虑使用接口实现若干个相同的方法。  

  Java代码如下:

abstract class Subject {
  private ArrayList<Observer> observersList = new ArrayList<Observer>();

  // add observers
  public void Attach(Observer ob) {
    observersList.add(ob);
  }

  // remove observers
  public void Detach(Observer ob) {
    observersList.remove(ob);
  }

  public void Notify()
  {
    for (Observer ob : observersList) {
      ob.Update();
    }
  }
}

abstract class Observer {
  public abstract void Update();
}

public class ConcreteObserver extends Observer {
  private String name;
  private String observerStatus;
  private ConcreteSubject subject;

  public ConcreteObserver(ConcreteSubject subject, String name)
  {
    this.subject = subject;
    this.name = name;
  }

  public void Update()
  {
    observerStatus = subject.getSubjectStatus();
  }
}

public class ConcreteSubject extends Subject {
  private String subjectStatus;

  public String getSubjectStatus() {
    return subjectStatus;
  }

  public void setSubjectStatus(String subjectStatus) {
    this.subjectStatus = subjectStatus;
  }

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ConcreteSubject s = new ConcreteSubject();

    s.Attach(new ConcreteObserver(s, "X"));
    s.Attach(new ConcreteObserver(s, "Y"));
    s.Attach(new ConcreteObserver(s, "Z"));

    s.setSubjectStatus("Ready");
    s.Notify();
  }
}

  上述代码中,有抽象观察者和抽象通知者。当Subject的状态改变之后,调用函数即可通知在其内部注册过的观察者。这种设计的思想在平时生活中也是比较常见的,就比如开头提到的生产大米的厂家和销售大米的商家。再来一个应用场景,比如书店中某一本书缺货了,顾客还是想买的话,可以进行登记,等到货后,书店老板会打电话依次通知想买书的顾客。这种注册的机制在其他的编程技巧中也是有很多体现的。比如程序向底层库注册多个回调函数,当条件满足时,底层库就会通知(或者说调用)最上层提供的回调函数。

  上述代码是Java写的,C++的话也是类似,主要是Subject保存Observer的指针。但是C++要考虑释放内存的问题,注意当Observer本身要被销毁时,必须要调用Subject的Detach函数,否则Update时可能会出现使用野指针造成crash的问题。可以考虑使用Subject管理Observer的生命周期。

(0)

相关推荐

  • java设计模式之观察者模式学习

    1.什么是观察者模式 简单情形:有A.B.C.D等四个独立的对象,其中B.C.D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策. 上面的这种情形,就是观察者模式. 当然可以有多个观察者,多个被观察者. 观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察. 2.观察者模式的应用 为了更好的理解什么是观察者模式,下面我举一些可能用到该模式的情形或例子: (1)周期性任务.比如linux中的周期性任务命令crontab命令,win7下的定时关机

  • 实例解析观察者模式及其在Java设计模式开发中的运用

    一.观察者模式(Observer)的定义: 观察者模式又称为订阅-发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来事件处理系统. 1.观察者模式的一般结构 首先看下观察者模式的类图描述: 观察者模式的角色如下: Subject(抽象主题接口):定义了主题类中对观察者列表的一系列操作, 包括增加,删除, 通知等. Concrete Subject(具体主题类): Observer(抽象

  • 学习Java设计模式之观察者模式

    观察者模式:对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察). 以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并发生相应的变化. 观察者模式有很多实现方式:该模式必须包含观察者和被观察对象两种角色.观察者和被观察者之间存在"观察"的逻辑关系,当被观察者发生改变的时候,观察者就会观察到这样的变化,发出相应的改变. /** * 观察者接口:观察者,需要用到观察者模式的类需实现此接口 */ public interface Observer { pu

  • Java经典设计模式之观察者模式原理与用法详解

    本文实例讲述了Java经典设计模式之观察者模式.分享给大家供大家参考,具体如下: 观察者模式:对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察). 以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并发生相应的变化. 观察者模式有很多实现方式:该模式必须包含观察者和被观察对象两种角色.观察者和被观察者之间存在"观察"的逻辑关系,当被观察者发生改变的时候,观察者就会观察到这样的变化,发出相应的改变. /** * 观察者接口:观察者,需要用到观察者模式的

  • Java设计模式开发中使用观察者模式的实例教程

    观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中.关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同. 关键要素 主题: 主题是观察者观察的对象,一个主题必须具备下面三个特征. 持有监听的观察者的引用 支持增加和删除观察者 主题状态改变,通知观察者 观察者: 当主题发生变化,收到通知进行具体的处理是观察者必须具备的特征. 为什么要用这种模式 这里举一个例子来说明,牛奶送奶

  • 用Java设计模式中的观察者模式开发微信公众号的例子

    还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总有一两个人在门口把风--如果有什么风吹草动,则会立即通知里面的同伙紧急撤退.也许放风的人并不一定认识里面的每一个同伙:而在里面也许有新来的小弟不认识这个放风的.但是这没什么,这个影响不了他们之间的通讯,因为他们之间有早已商定好的暗号. 呵呵,上面提到的放风者.偷窃者之间的关系就是观察者模式在现实中的活生生的例子. 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式.GOF给观察者模式如下

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

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本教程所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用. 虽然网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就"

  • 深入解析Java设计模式编程中观察者模式的运用

    定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. 类型:行为类模式 类图: 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化.比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单:再比如,我们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中.这两个功能有一个相似的地方,那就是一个对象

  • Java设计模式之观察者模式_动力节点Java学院整理

    定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. 类型:行为类模式 类图: 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化.比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单:再比如,我们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中.这两个功能有一个相似的地方,那就是一个对象

  • Java设计模式之观察者模式原理与用法详解

    本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己. 也可以这样理解: 观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟模式.观察者模式中有一个称作"主题"的对象和若干个称作"观察者"的对象,"主题"和&qu

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

    一.观察者模式是什么? 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).当一个对象被修改时,则会自动通知依赖它的对象.观察者模式属于行为型模式. 人话: 就像微信公众号推送消息,订阅的人能收到,没订阅的收不到,还可以取消/添加订阅 二.模式分析 2.1 四个角色 抽象主题(抽象被观察者角色):也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象类和接口来实现

  • java设计模式之观察者模式的介绍及使用

    一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(通知者).这个主题对象观察到被观察者发生变化时,会通知所有的观察者对象,使它们能够自己更新自己 这里涉及了几个角色及他们自己功能: 观察者对象:可以更新自己 主题对象:可以添加观察者,移除观察者,通知观察者 被观察者:被主题对象监视,当被观察者发生变化时,主题对象会通知观察者更新自己的状态 二.使用场景 当一个对象改变需要同时改变其他对象的时候,而且不需要知道有多少个对象需要改变 三.举个例子 如果干巴巴的概

  • java设计模式之观察者模式

    观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己.将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和复用都带来不便.观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体. 观察者模式是实际中应用比较广泛的模

  • 深入理解Java设计模式之观察者模式

    目录 一.什么是观察者模式 二.观察者模式的结构 三.观察者模式的使用场景 使用观察者模式也有两个重点问题要解决: 广播链的问题. 异步处理问题. 四.观察者模式的优缺点 五.观察者模式的实现 六.观察者模式和委托的结合 七.总结 一.什么是观察者模式 在许多设计中,经常涉及多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,也就是说当对象间存在一对多关系时,在这样的情况下就可以使用观察者模式.当一个对象被修改时,则会自动通知它的依赖对象. 观察者模式是

随机推荐