1.观察者模式定义 

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

  这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

  2.观察者模式结构图

  

  3.观察者模式的构成

  ●  抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。

  ●  具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。

  ●  抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。

  ●  具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。

深入理解观察者模式请进入该博客

  4.代码实现

抽象主题(Subject)角色:

 1 package main.java.pub_sub2;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 /**
7 * @ClassName: Subject
8 * @Description: 抽象主题(Subject)角色
9 * @author JinXing
10 * @date 2017年11月1日 下午2:00:52
11 *
12 */
13 public abstract class Subject {
14
15 private List<Observer> list=new ArrayList<Observer>();
16
17 /**
18 * 注册观察者
19 * @Title: addObserver
20 * @author JinXing
21 * @date 2017年11月1日 下午2:04:33
22 * @param obj
23 * @return void
24 */
25 public void addObserver(Observer obj){
26 list.add(obj);
27 }
28
29 /**
30 * 删除观察者
31 * @Title: delObserver
32 * @author JinXing
33 * @date 2017年11月1日 下午2:04:33
34 * @param obj
35 * @return void
36 */
37 public void delObserver(Observer obj){
38 list.remove(obj);
39 }
40
41 /**
42 * 通知所有的观察者
43 * @Title: notifyAllObserver
44 * @author JinXing
45 * @date 2017年11月1日 下午2:11:34
46 * @param @param msg
47 * @return void
48 */
49 public void notifyAllObserver(){
50 for (Observer observer : list) {
51 observer.update(this);
52 }
53 }
54
55 }

    具体主题(ConcreteSubject)角色:

 1 package main.java.pub_sub2;
2
3 /**
4 * @ClassName: GameSubject
5 * @Description: 游戏主题
6 * @author JinXing
7 * @date 2017年11月1日 下午2:13:08
8 *
9 */
10 public class GameSubject extends Subject{
11
12 private String name;//发布人
13 private String content;//发布内容
14
15 public String getName() {
16 return name;
17 }
18 public String getContent() {
19 return content;
20 }
21
22 public void setName(String name) {
23 this.name = name;
24 }
25 public void setContent(String content) {
26 this.content = content;
27 }
28 public GameSubject() {
29 super();
30 }
31 public GameSubject(String name, String content) {
32 super();
33 this.name = name;
34 this.content = content;
35 }
36
37 @Override
38 public String toString() {
39 return "GameSubject [name=" + name + ", content=" + content + "]";
40 }
41 /**
42 * 开始主题活动
43 * @Title: sendSubject
44 * @author JinXing
45 * @date 2017年11月1日 下午2:13:26
46 * @param @param msg
47 * @return void
48 */
49 public void sendSubject(GameSubject sub){
50
51 System.out.println("当前主题为:"+sub.getContent());
52 this.notifyAllObserver();
53 }
54 }

  抽象观察者(Observer)角色:

 1 package main.java.pub_sub2;
2
3 /**
4 * @ClassName: Observer
5 * @Description: 抽象观察者(Observer)角色
6 * @author JinXing
7 * @date 2017年11月1日 下午2:14:52
8 *
9 */
10 public interface Observer {
11
12 public void update(Subject subject);
13
14 }

具体观察者(ConcreteObserver)角色:

 1 package main.java.pub_sub2;
2
3 /**
4 * @ClassName: PcPlayer
5 * @Description:PC玩家 (观察者)
6 * @author JinXing
7 * @date 2017年11月1日 下午2:18:44
8 *
9 */
10 public class PcPlayer implements Observer{
11
12 @Override
13 public void update(Subject sub) {
14 GameSubject gameSub=(GameSubject) sub;
15 String msg=gameSub.getContent();
16 if(msg!=null){
17 msg=msg.toLowerCase();
18 }
19
20 if(msg.contains("pc")){
21 System.out.println("PC玩家:我对这个主题非常感兴趣!");
22 }else{
23 System.out.println("PC玩家:这个主题很无聊!");
24 }
25
26 System.out.println("本次游戏主题发布者:"+gameSub.getName());
27
28 }
29
30 }

测试:

 1 package main.java.pub_sub2;
2
3 public class Test {
4
5 public static void main(String[] args) {
6
7 String name="jack";
8 String content="英雄联盟手游版+PC版";
9
10 //主题对象
11 GameSubject sub=new GameSubject(name,content);
12 //观察者对象
13 Observer obj1=new PcPlayer();
14 //添加观察者
15 sub.addObserver(obj1);
16 sub.sendSubject(sub);
17
18 }
19
20 }

java设计模式之-观察者模式(发布-订阅模式)的更多相关文章

  1. C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

  2. SpringBoot事件监听机制及观察者模式/发布订阅模式

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

  3. 设计模式 | 观察者模式/发布-订阅模式(observer/publish-subscribe)

    定义: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 结构:(书中图,侵删) 一个抽象的观察者接口, ...

  4. javascript中的发布订阅模式与观察者模式

    这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一. 设计模式的背景 设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学. 设计模式的定义是 ...

  5. [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  6. javascript设计模式——发布订阅模式

    前面的话 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模 ...

  7. 观察者模式 vs 发布-订阅模式

    我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回 ...

  8. 《JavaScript设计模式与开发实践》-- 发布-订阅模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-fabudingyue/ 发布-订阅模式 1.定义 发布-订阅模式:发布-订阅模式又叫观察者模 ...

  9. js之观察者模式和发布订阅模式区别

    观察者模式(Observer) 观察者模式指的是一个对象(Subject)维持一系列依赖于它的对象(Observer),当有关状态发生变更时 Subject 对象则通知一系列 Observer 对象进 ...

  10. JavaScript设计模式(发布订阅模式)

    发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...

随机推荐

  1. python之+=与+(转载)

    先看一个简单的例子 从程序分析,进行直接+操作后,python会重新生成一个对象,而进行+=操作并不改变原来的对象,是在原来对象的基础上进行操作,所以+=也称为就地加 除此之外+和+=还有不同: 从程 ...

  2. LeetCode(92):反转链表 II

    Medium! 题目描述: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-&g ...

  3. LeetCode(85):最大矩形

    Hard! 题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0",&quo ...

  4. 单例、异常、eval函数

    一.单例 01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他 ...

  5. poj2513--并查集+欧拉路+字典树

    经典好题,自己不知道哪里错了交上去是RE,可能是数组开的不好吧,字典树老碰到这种问题.. 先马上别人的代码,有空对拍看看 #include <cstdio> #include <cs ...

  6. selenium 操作键盘

    send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kye ...

  7. 论文阅读笔记三十八:Deformable Convolutional Networks(ECCV2017)

    论文源址:https://arxiv.org/abs/1703.06211 开源项目:https://github.com/msracver/Deformable-ConvNets 摘要 卷积神经网络 ...

  8. P0505

      算法训练 P0505   时间限制:1.0s   内存限制:256.0MB      一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积.阶乘的增长速度非常快,例如,13!就已经比较大了 ...

  9. 蓝桥杯  历届试题 幸运数  dfs

    历届试题 幸运数 时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...

  10. spring quartz整合实现定时器自动注解

    1.web.xml中添加侦听器 <listener>    <listener-class>org.springframework.web.context.ContextLoa ...