设计模式 | 观察者模式/发布-订阅模式(observer/publish-subscribe)
定义:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
结构:(书中图,侵删)

实例:
package designpattern.observer;
public interface Fans {
public void react(String result);
}
package designpattern.observer;
public class HomeFans implements Fans {
@Override
public void react(String result) {
System.out.print("主场球迷:");
if (result.equals("win")) {
System.out.println("Yes! 我们赢啦,主场就是牛批!!!");
} else {
System.out.println("输了,哎...");
}
}
}
package designpattern.observer;
public class AwayFans implements Fans {
@Override
public void react(String result) {
System.out.print("客场球迷:");
if (result.equals("win")) {
System.out.println("输了,哎...");
} else {
System.out.println("Yes! 客场都赢啦,牛批!!!");
}
}
}
package designpattern.observer; import java.util.ArrayList;
import java.util.List; public interface Match {
List<Fans> fansList = new ArrayList<>();// 这一句 void addFans(Fans fans); void removeFans(Fans fans); void notifyResult(String result); }
package designpattern.observer; import java.util.ArrayList;
import java.util.List; public class MatchOnTheSpot implements Match {
// List<Fans> fansList = new ArrayList<>(); @Override
public void addFans(Fans fans) {
fansList.add(fans);
} @Override
public void removeFans(Fans fans) {
fansList.remove(fans);
} @Override
public void notifyResult(String result) {
for (Fans fans : fansList) {
fans.react(result);
}
}
}
package designpattern.observer; import java.util.ArrayList;
import java.util.List; public class MatchOnTheTV implements Match {
// List<Fans> fansList = new ArrayList<>(); @Override
public void addFans(Fans fans) {
fansList.add(fans);
} @Override
public void removeFans(Fans fans) {
fansList.remove(fans);
} @Override
public void notifyResult(String result) {
for (Fans fans : fansList) {
fans.react(result);
}
}
}
package designpattern.observer;
public class Client {
public static void main(String[] args) {
HomeFans homeFans = new HomeFans();
AwayFans awayFans = new AwayFans();
// 现场看
Match match = new MatchOnTheSpot();
match.addFans(homeFans);
match.addFans(awayFans);
System.out.println("主场赢啦~");
match.notifyResult("win");
System.out.println("===========================");
// 电视上看
match = new MatchOnTheTV();
System.out.println("主场输啦~");
match.notifyResult("lose");
}
}
主场赢啦~
主场球迷:Yes! 我们赢啦,主场就是牛批!!!
客场球迷:输了,哎...
===========================
主场输啦~
主场球迷:输了,哎...
客场球迷:Yes! 客场都赢啦,牛批!!!
总结:
设计模式 | 观察者模式/发布-订阅模式(observer/publish-subscribe)的更多相关文章
- RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)
工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...
- RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个 ...
- RabbitMQ的发布订阅模式(Publish/Subscribe)
一.发布/订阅(Publish/Subscribe)模式 发布订阅是我们经常会用到的一种模式,生产者生产消息后,所有订阅者都可以收到.RabbitMQ的发布/订阅模型图如下: 1.该模式下生产者并不是 ...
- [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1
<JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...
- js设计模式之发布/订阅模式模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
- js设计模式之发布订阅模式
1. 定义 发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知. 订阅者(Subscriber)把自己想订阅的事件注册(Subscri ...
- C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- SpringBoot事件监听机制及观察者模式/发布订阅模式
目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...
- javaScript设计模式:发布订阅模式
发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...
随机推荐
- HTTP协议、Ajax请求
今天这篇文章呢,主要讲的就是关于HTTP协议.Ajax请求以及一些相关的小知识点.虽然内容不算多,可是是很重点的东西~ HTTP协议 1. http:超文本传输协议.简单.快速.灵活.无状态.无连接. ...
- cw2vec理论及其实现
导读 本文对AAAI 2018(Association for the Advancement of Artificial Intelligence 2018)高分录用的一篇中文词向量论文(cw2ve ...
- Codeforces Round #483 (Div. 2) C. Finite or not?
C. Finite or not? time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Spring Cloud分布式微服务系统中利用redssion实现分布式锁
在非分布式系统中要实现锁的机制很简单,利用java.util.concurrent.locks包下的Lock和关键字synchronized都可以实现.但是在分布式系统中,如何实现各个单独的微服务需要 ...
- mysql分表经验总结
一.为什么要分表? 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间.根据个人经验,mysql执行一个s ...
- win7 telnet命令无法开启的解决方案(不是内部命令或外部命令)
如果你想在win 7上直接使用 telnet命令,却不能开启那怎么办呢?记得在Wingdows XP上telnet都是已经安装好的,直接就可用,但是Win7是没有这个功能的,都需要后来自己安装的,下面 ...
- Class path & Path
Class path: 配置类文件 (配置完之后,在任何盘符下都可以访问该配置路径下的文件); Path: 配置可执行文件; Class path 配置时路径后面加分号与不加分号的区别 (当前路径与配 ...
- Eclipse中启动tomcat: java.lang.OutOfMemoryError: PermGen space的解决方法
tomcat启动的时候出现这种错误一般是项目引用了太多的jar包,或者反射生成了太多的类,或者有太多的常量池,导致非堆内存中永久保存区域不够,就有可能会报java.lang.OutOfMemoryEr ...
- teeporxy.go
package,, { cer, err := tls.LoadX509KeyPair(*tlsCertificate, *tlsPrivateKey) if err ...
- BZOJ_1803_Spoj1487 Query on a tree III_主席树+dfs序
BZOJ_1803_Spoj1487 Query on a tree III_主席树 Description You are given a node-labeled rooted tree with ...