观察者模式是行为模式的一种,它的作用是当一个对象的状态发生变化时,能够自动通知关联对象,自动刷新对象状态。

观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

角色和职责:

1.被观察者(Observable)-Observable:

   被观察者对象,当需要被观察者的状态发生变化时,需要通知队列中所有观察者对象。Subscribe需要维持(添加,删除,通知)一个观察者对象的队列列表。

2.被观察者具体实现(Concrete Observable)-Subscibe:

被观察者具体实现,包含一些基本的属性状态及其他操作

3.观察者(Observer)-Observer:

当subscribe状态发生变化时,Observer对象将通过一个callback函数得到通知

4.观察者具体实现Concrete Observer)-Observer1、Observer2:

观察者具体实现,得到通知后将完成一些具体的业务逻辑处理

UML图:

具体代码:

/**
* 文章
*/
public class Article {
private String articleTitle;//文章标题
private String articleContent;//文章内容 public String getArticleTitle() {
return articleTitle;
} public void setArticleTitle(String articleTitle) {
this.articleTitle = articleTitle;
} public String getArticleContent() {
return articleContent;
} public void setArticleContent(String articleContent) {
this.articleContent = articleContent;
}
}
import java.util.Observable;

/**
* 订阅号
*/
public class Subscribe extends Observable {
/**
* 新增文章
*/
public void insertArticle(Article article){
//新增一篇文章
System.out.println("新增一篇文章");
this.setChanged();//观察者模式标记已更改
this.notifyObservers(article);//告诉订阅者,这边的通知是依次通知
} }
import java.util.Observable;
import java.util.Observer; /**
* 订阅者1
*/
public class Observer1 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("订阅者1,收到订阅号的通知");
Article article = (Article)arg;
System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
}
}
import java.util.Observable;
import java.util.Observer; /**
* 订阅者2
*/
public class Observer2 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("订阅者2,收到订阅号的通知");
Article article = (Article)arg;
System.out.println("标题:"+article.getArticleTitle()+",内容:"+article.getArticleContent());
}
}
public class Main {
public static void main(String[] args) {
Article article = new Article();
article.setArticleTitle("圆周率的实现");
article.setArticleContent("圆是一个圆圈。。。"); Subscribe subscribe= new Subscribe();//订阅号
subscribe.addObserver(new Observer1());//订阅者1
subscribe.addObserver(new Observer2());//订阅者2
subscribe.insertArticle(article);//订阅号新增一篇文章
}
}

结果:

新增一篇文章
订阅者2,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。
订阅者1,收到订阅号的通知
标题:圆周率的实现,内容:圆是一个圆圈。。。

应用场景:

  • 倾听事件驱动程序设计中的外部事件
  • 监听某个对象的状态变化
  • 发布者/订阅者模型中,当一个外部被触发时,通知邮件列表中的订阅者

源码地址:https://github.com/qjm201000/design_pattern_observer.git

设计模式-观察者模式(Observer)的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  4. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  5. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  6. 设计模式--观察者模式Observer(对象行为型)

    一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...

  7. 大话设计模式--观察者模式 Observer -- C++ 实现实例

    大话设计模式--1.观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的 观察者对象,使他们能够自动更新自己. 使用场合: 当一 ...

  8. [工作中的设计模式]观察者模式observer

    一.模式解析 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式又叫订阅发布模式, ...

  9. C#设计模式——观察者模式(Observer Pattern)1

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  10. C#设计模式——观察者模式(Observer Pattern)

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

随机推荐

  1. gnuradio companion 找不到第三方模块gr-osmosdr的问题

    我使用了来自Ettus的gnuradio软件包,之后安装了gr-osmosdr 以在gnuradio中调用RTL电视棒. 但是在gnuradio companion找不到来自rtlsdr-source ...

  2. Java发展历程

    Java 的发展要追溯到 1991 年,Patrick Naughton(帕特里克·诺顿)和 James Gosling(詹姆斯·高斯林)带领 Sun 公司的工程师打算为有线电视转换盒之类的消费产品设 ...

  3. winform实现DataGridView全选

    之前写过,一时想不起来就在网上找了一些.结果感觉好麻烦.于是就自己打开之前做过的功能.找到源码. private void CheckDatabasexuan() { DataGridViewChec ...

  4. Rails 最佳实践

    在你业务简单的时候,让你简简单单用 ActiveRecord 模型. 复杂的时候,你可以用官方推荐的 Concerns. 更复杂的时候,可以通过 gem 和 API 来拆分. 极端复杂的时候,由于 R ...

  5. 微信小程序把玩(二十八)image组件

    原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...

  6. 用VS2010构建MASM的编程环境,开始使用MASM(翻译自《Inetl汇编语言程序设计》一书的作者Kip R. Irvine的文章Getting Started with MASM),两种方法搭建IA-32汇编设计环境

    http://blog.csdn.net/jinsonghu/article/details/5688020 http://blog.csdn.net/jinsonghu/article/detail ...

  7. PHP 的魔术方法及其应用

    PHP中将所有__(两个下划线)开头的类方法作为魔术方法,这方法之所以称为魔术方法是因为其实现的功能就如变魔术一样感觉很神奇.在特定的事件下触发,这真的很酷. **__construct()** 这个 ...

  8. tf.nn.softmax & tf.nn.reduce_sum & tf.nn.softmax_cross_entropy_with_logits

    tf.nn.softmax softmax是神经网络的最后一层将实数空间映射到概率空间的常用方法,公式如下: \[ softmax(x)_i=\frac{exp(x_i)}{\sum_jexp(x_j ...

  9. Uncaught (in promise)

    Uncaught (in promise) 使用es6的promise时候,有时候会出现如下错误: 这是因为,使用定义promise方法的时候,reject了,但是,在使用的地方没有用catch进行接 ...

  10. autotools工具使用 good

    学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道configure脚本是 autoconf生成的:但是真正想用起来autoconf ...