设计模式-观察者模式(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)
一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...
随机推荐
- php_Ubuntu Linux下为PHP5安装cURL,mysql
如果你在用PHP, 你可能需要用到cURL, 这是其中最流行的插件. PHP CURL插件需要通过libcurl来实现, Daniel Stenberg创建的一个库, 能够和许多不同类型协议的web服 ...
- linux没有 conio.h解决的方式
conio.h不是C标准库中的头文件,在ISO和POSIX标准中均未定义. conio是Console Input/Output(控制台输入输出)的简写,当中定义了通过控制台进行数据输入和数据输出的函 ...
- 用curl访问HTTPS站点并登录(对HTTP返回的结果特别清楚)
开发网站,少不了测试.现在的网站为了加强安全性,都启用了HTTPS协议.所谓HTTPS,也就是HTTP文本在SSL协议中传输.用curl命令行来测试HTTPS站点是个很有用的功能,写点脚本,就可以做功 ...
- WPF中任意Object的XAML代码格式化输出
原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...
- WAMP采用别名时ThinkPHP5项目设置方法
打开public目录下的.htaccess文件,并在其中添加 RewriteBase /xxx<IfModule mod_rewrite.c> Options +FollowSymlink ...
- Android 查看App冷启动时间/热启动时间/页面打开时间
Android 查看App冷启动时间/热启动时间/页面打开时间 冷启动时间 热启动时间 页面打开时间 通过adb查看 adb shell am start -W packageName/Activit ...
- Word Embeddings: Encoding Lexical Semantics
Word Embeddings: Encoding Lexical Semantics Getting Dense Word Embeddings Word Embeddings in Pytorch ...
- C# Excel导入Access
/// <summary> /// 导入 /// </summary> private void btn_In_Click(object sender, EventArgs e ...
- Resolve conflict using "MERGE_HEAD (origin/HEAD)"
Git进行同步的时候,经常会出现冲突,有时候冲突的选项会有图示中的三种选项: 1.Resolved:直接把文件标识为冲突已经解决,一般是自己手动查看并解决完冲突以后使用. 2.Resolve conf ...
- Android零基础入门第22节:ImageView的属性和方法大全
原文:Android零基础入门第22节:ImageView的属性和方法大全 通过前面几期的学习,TextView控件及其子控件基本学习完成,可以在Android屏幕上显示一些文字或者按钮,那么从本期开 ...