设计模式-观察者模式(Observer)
观察者模式是行为模式的一种,它的作用是当一个对象的状态发生变化时,能够自动通知关联对象,自动刷新对象状态。
观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
角色和职责:
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)的更多相关文章
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
- 设计模式--观察者模式Observer(对象行为型)
一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...
- 大话设计模式--观察者模式 Observer -- C++ 实现实例
大话设计模式--1.观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的 观察者对象,使他们能够自动更新自己. 使用场合: 当一 ...
- [工作中的设计模式]观察者模式observer
一.模式解析 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式又叫订阅发布模式, ...
- C#设计模式——观察者模式(Observer Pattern)1
一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...
- C#设计模式——观察者模式(Observer Pattern)
一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...
随机推荐
- [WPF]自定义鼠标指针
原文:[WPF]自定义鼠标指针 [WPF]自定义鼠标指针 周银辉 看看WPF Cursor类的两个构造函数吧: * f)); g.Flush(); g.D ...
- hdu 4035 可能性DP 成都网络游戏
http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来 ...
- linux之tail -F命令异常file truncated
使用tail -F收集日志时,经常报出file truncated, 导致日志又重新读取.tail: `test.out' has appeared; following end of new fi ...
- SVN如何迁徙到Git
由于一直都是采用SVN作为源码管理,转到Git不能从头开始吧~~下面就具体说说如何将SVN已有的项目工程迁徙到Git上面 步骤 (1) 安装Git客户端程序(2) 将SVN上面的工程通过Git克隆到本 ...
- Web应用程序和网站的区别
1项目就是一个应用程序.在VS中查看的时候,项目中建立的一般处理程序,有两个文件,网站只有一个.写个代码测试,发现在代码层次上没有2再有就是项目中的一般处理程序有命名空间,而网站中的没有.WEB网站每 ...
- Delphi7下安装TMS component控件
1.启动delphi7.2.File-->Open Project ...打开TMS component 源目录下的“tmsd7.bpg”. 3.在打开的窗口列表中,依次在各选项上点击鼠标右键, ...
- WPF如何判断PNG中的点是透明的
最近想用WPF做个空战游戏,其中就要解决子弹是否击中飞机的问题.这里面飞机用了PNG图片,大家都知道飞机是不规则图案,如何判断子弹碰撞成了一个难题. 好在我在网上找到了一个可以获取bitmap像素点颜 ...
- 以太坊(ethereum)开发DApp应用的入门区块链技术教程
概述 对初学者,首先要了解以太坊开发相关的基本概念. 学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...
- windows下Qt5.2 for android开发环境搭建
windows下Qt5.2 forAndroid开发环境配置 1.下载安装Qt 5.2.0 for Android (Windows 32-bit) http://qt-project.org/d ...
- 我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 Internet 上用于确保您通信的安全性。
早上使用.Net WebClient类采集亚马逊数据,返回http 400 Bad Request错误,内容里面有“我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 ...