记得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)的更多相关文章

  1. HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)

    观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...

  2. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

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

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

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

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

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

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

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

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

  7. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  8. jQuery中的观察者模式(Observer Pattern)

    在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...

  9. 设计模式(二)The Observer Pattern 观察者模式

    问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...

  10. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

随机推荐

  1. WPF中如何选择合适的元数据标记?(英文)

    原文:WPF中如何选择合适的元数据标记?(英文) FrameworkPropertyMetadataOptions Enumeration:Specifies the types of framewo ...

  2. XMPPFramework

    XMPP Extensible Messaging and Present Protocol 可扩展消息处理现场协议 特征: XMPP使用tcp传XML流程, 做IM xmpp.org objcio. ...

  3. c#调用ffmpeg嵌入srt/ass字幕提示Unable to open xxx.srt......

    最近接触到c#调用ffmpeg嵌入srt/ass字幕,碰到一个错误困扰了很久 Unable to open xxx.srt Error initializing filter 'subtitles' ...

  4. 线程池;java的线程池的实现原理;适用于频繁互动(如电商网站)

    线程池是一种多线程处理形式,处理过程中将任务加入到队列,然后在创建线程后自己主动启动这些任务.线程池线程都是后台线程.每一个线程都使用默认的堆栈大小,以默认的优先级执行.并处于多线程单元中. 假设某个 ...

  5. angular.js分页代码的实例

    对于大多数web应用来说显示项目列表是一种很常见的任务.通常情况下,我们的数据会比较多,无法很好地显示在单个页面中.在这种情况下,我们需要把数据以页的方式来展示,同时带有转到上一页和下一页的功能.现在 ...

  6. hibernate关于多对多注解配置

    Game实体类配置关系 @Entity @Table(name = "game") public class Game { @Id @GeneratedValue private ...

  7. mac 端安装JAVA开发环境

    一.maven安装 下载地址   https://maven.apache.org/download.cgi 下载 apache-maven-3.5.2-bin-zip 将下载的文件放在某路径下 修改 ...

  8. 关于hibernate一对一配置

    实体类关系 一对一 一对多 多对一 多对多 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分 ...

  9. XF 列表视图绑定集合

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. 基于Go语言快速构建RESTful API服务

    In this post, we will not only cover how to use Go to create a RESTful JSON API, but we will also ta ...