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

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

角色和职责:

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. WPF依赖属性对内存的使用方式

    WPF允许对象在创建时候并不包含存储数据的空间,只保留在用到时获取数据默认值,借用其他对象数据或者实时分配空间的能力

  2. GAC的一种非官方实现方式

    1.GAC简介 全局程序集缓存(Global Assembly Cache, GAC)计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享.在全局程序集缓存中部署的应 ...

  3. C#基础加强篇—委托、Lambda表达式和事件(下)

    3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...

  4. ADB命令笔记本

    ADB即Android Debug Bridge,作为电脑操作手机的工具,被Android开发者和众多国内xxx安全管家所使用.在此记录一些常见的命令,随时更新,方便以后查找.(万一以后我也要开发一款 ...

  5. Android零基础入门第45节:GridView简单使用

    原文:Android零基础入门第45节:GridView简单使用 前面一共用了8期来学习ListView列表的相关操作,其实学习的ListView的知识完全适用于AdapterView的其他子类,如G ...

  6. Qt Widget 利用 Qt4.5 实现酷炫透明窗体

    本文讲述的是Qt Widget 利用 Qt4.5 实现酷炫透明窗体,QWidget类中的每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分 ...

  7. 核心思想:许多公司都没有认识到云储存的革命性(类似QQ把它搞成了用户的家、再也离不开了)

    在云储存刚刚兴起的时候,也就是dropbox刚刚进入大家视野的时候.许多人都是简单的认为这只是一个提供在线存储的服务而已,许多公司都没有认识到云储存的革命性. 对于这些大公司贸然进入一些新的领域是需要 ...

  8. PRML Chapter3

    曲线拟合的几种方法 最大似然估计MLE,最大后验概率MAP:MLE和MAP MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即"模型已定, ...

  9. SVN更新报错问题(Please execute the 'Cleanup' command)

    SVN更新报错问题(Please execute the 'Cleanup' command) https://segmentfault.com/a/1190000012571289 svn: E20 ...

  10. LockWindowUpdate的函数的用法(不忽略消息,只是暂时不响应,但WM_SETREDRAW根本不接受重绘消息)

    Application.ProcessMessages;LockWindowUpdate(Self.Handle);  //锁住当前窗口 LockWindowUpdate(0)//解除锁定窗口 Loc ...