【设计模式】行为型03观察者模式(Observer Pattern)
记得16年初第一次学习了23种设计模式,但是除了少数几个简单的外,其他的很多都是学了个似懂非懂,以至于有人问起甚至说不上来,现在想想,其实就是没看懂而已。例如观察者模式,其实原理很简单,但是当时并没有能静下心来细细总结,在此自我反思,也望后来者共勉。
而关于设计模式是否能够被用的到这个问题,其实当我们遇到很多业务场景的时候,也会自然而然的想到与设计模式类似的思路,所以设计模式并没有我多年前认为的那么深不可测。然后就是类似于发布订阅这种需求,在如今大数据高并发的前提下,也已经有了很多完善的中间件框架,所以本人用到的极少。但并不是说没有用,例如JDK中大量使用的“委托”(并不在23中设计模式中),可以重用大量代码,是我最喜欢的设计模式,以后的博客中会详细描述。
废话说完 ,开始正题:
观察者模式,其实就是发布订阅模式,发布者发布信息,订阅者订阅就能收到信息,没订阅就收不到信息。
应用场景:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
实现方式:
类图:
代码(参考了runnoob网站案例,稍作精简修改):
1、首先我定义了一个公众号,持有一个被观察者对象的集合,发布文章时会调用方法通知所有观察者:
package com.pat.observer;
/**
* 被观察者-模仿公众号
* @author Administrator
*
*/
import java.util.ArrayList;
import java.util.List;
public class Subject {
//即将更新的头条文章
private String articles;
//持有观察者集合
private List<Observer> observers=new ArrayList<>();
public String getArticles() {
return articles;
}
public void setArticles(String articles) {
this.articles = articles;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for(Observer obs:observers) {
obs.update();
}
}
}
2、定义一个订阅者(观察者)接口或者抽象类:
package com.pat.observer;
/**
* 观察者
* @author Administrator
*
*/
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
3、假设存在A、B、C三位订阅者,继承观察者对象:
package com.pat.observer;
public class ObserverA extends Observer{
@Override
public void update() {
System.out.println("观察者A查看订阅的Subject公众号>>>"+subject.getArticles());
}
public ObserverA(Subject subject) {
this.subject=subject;
this.subject.attach(this);
}
}
package com.pat.observer;
public class ObserverB extends Observer{
@Override
public void update() {
System.out.println("观察者B查看订阅的Subject公众号>>>"+subject.getArticles());
}
public ObserverB(Subject subject) {
this.subject=subject;
this.subject.attach(this);
}
}
package com.pat.observer;
public class ObserverC extends Observer{
@Override
public void update() {
System.out.println("观察者C查看订阅的Subject公众号>>>"+subject.getArticles());
}
public ObserverC(Subject subject) {
this.subject=subject;
this.subject.attach(this);
}
}
4、测试类中我们被观察者(被订阅者)发布文章:
package com.pat.observer;
public class Test {
public static void main(String[] args) {
Subject sub = new Subject();
new ObserverA(sub);
new ObserverB(sub);
new ObserverC(sub);
sub.setArticles("Subject更新文章《如何高效装逼》");
}
}
5、结果:
观察者A查看订阅的Subject公众号>>>Subject更新文章《如何高效装逼》
观察者B查看订阅的Subject公众号>>>Subject更新文章《如何高效装逼》
观察者C查看订阅的Subject公众号>>>Subject更新文章《如何高效装逼》
【设计模式】行为型03观察者模式(Observer Pattern)的更多相关文章
- HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)
观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式-观察者模式(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 Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- jQuery中的观察者模式(Observer Pattern)
在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...
- 设计模式(二)The Observer Pattern 观察者模式
问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...
- c#设计模式之观察者模式(Observer Pattern)
场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...
随机推荐
- hadoop2.4.1的ftpserver建立
对于公司框架hadoop+hive,hive通过建立外部表(EXTERNAL TABLE)可以直接识别hdfs档,直接那假说本地文件hdfs文件系统.hive. 这期间须要一个ftp软件,能够沟通本地 ...
- 图像处理结果的度量 —— SNR、PSNR、SSIM
衡量两幅图像的相似度: SNR/PSNR SSIM 1. SNR vs PSNR about SNR 和 PSNR MSE:mean squared error ∑x=1Nx∑y=1Ny(f(x,y) ...
- WPF: Creation of Text Labels for 3D Scene
原文:WPF: Creation of Text Labels for 3D Scene 转载:http://www.codeproject.com/KB/WPF/WPF_Text3D.aspx Do ...
- crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs
1.开始 作者自己:开发人员,Asp.Net , html / js , restful , memcached , oracle ,windows , iis 目标读者:供自己以后回顾 2.我看No ...
- iOS-swift-如何实现崩溃树级别文件夹和扩大
如何实现崩溃树级别文件夹和扩大 1 介绍 最近,它一直在使用swift写项目,现在,他已经完成了不到一半,大概11可在一月中旬完成,什么时候会出一系列视频,源代码放出来.我是iOS 零基础学习 ...
- WPF 获得DataGridRow和 DataGridCell的方法
原文:WPF 获得DataGridRow和 DataGridCell的方法 原文地址 简介 在WPF中,DataGrid控件并没有提供访问其DataGridRow或者DataGridCell的方法. ...
- WPF 4 DataGrid 控件(进阶篇一)
原文:WPF 4 DataGrid 控件(进阶篇一) 上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...
- SICP 1.29-1.33
1.29 (define (sum term a next b) (if (> a b) (+ (term a) (sum term (next a) next b)))) (define (c ...
- C# WebBrowser的使用
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- telerik ChartGrid浅谈
在最近接触的项目中,有很多都是以Chart图表的方式呈现出来的,关于telerik Chart的使用,有几个小点跟大家分享一下. 1:本例子使用的Chart的命名空间为 xmlns:telerik=h ...