设计模式 | 观察者模式/发布-订阅模式(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设计模式:发布订阅模式
		发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ... 
随机推荐
- 团队项目第二阶段个人进展——Day7
			一.昨天工作总结 冲刺第七天,动手完成了一个demo来实现数据的上传与下载 二.遇到的问题 代码逻辑没看太懂 三.今日工作规划 对发布页面的数据进行处理,实现能够请求和响应,并学习如何实现图片的上传与 ... 
- CSS中的变形、过渡、动画效果
			一.变形 .过渡效果 1:元素平移 x方向 y方向 transform:translate(100px 100px); 2:过渡动画效果 a:什么属性参与过渡效果 b:过渡时间 c:过渡的效果 值包含 ... 
- 【定时器】Quartz初步实验
			第一步:创建项目 创建一个新项目,可以是ASP.NET MVC,WebForms,Winforms等多种.Net项目,这里使用的是VS2017,创建了一个MVC项目 创建完成后大致项目层级为: 第二部 ... 
- arcEngine开发之根据点坐标创建Shp图层
			思路 根据点坐标创建Shapefile文件大致思路是这样的: (1)创建表的工作空间,通过 IField.IFieldsEdit.IField 等接口创建属性字段,添加到要素集中. (2)根据获取点的 ... 
- Android 样式的开发(转)
			Android(2) 目录(?)[-] rectangle oval line ring layer-list篇 普通图片 bitmap标签 点九图片 nine-patch标签 color标签 ... 
- Window 下mysql binlog开启及查看,mysqlbinlog
			查看是否开启了binlog: win+r => cmd => 连接mysql=>show variables like 'log_%'; mysql> show variabl ... 
- 使用Docker镜像和仓库
			https://www.rhel.cc/2014/11/50/ 学习目标: 什么是镜像 docker镜像是由文件系统折叠加而成的,最低端是一个引导文件系统,即bootfs: 如何对镜像进行管理 使 ... 
- JS中清空字符串前后空格
			在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 . 所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ... 
- Android推送  百度云推送  入门篇
			转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和D ... 
- 用python对比两张图片的不同
			from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_lo ... 
