设计模式——行为型模式_观察者模式/发布-订阅模式
1. 类图
2. 角色
- Subject:被观察者,抽象类
- ConcreteSubject:被观察者的具体类,每个具体类中有列表记录任意数量的观察者
- Observer:观察者接口
- ConcrereObserver:具体观察者
3. 代码
- 观察者
- 观察者抽象接口
public interface Observer {public void update(String message); }
- 观察者实现类
public class WeixinUser implements Observer {private String name; // 微信用户名public WeixinUser(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + "-" + message);} }
- 观察者抽象接口
- 被观察者
- 被观察者接口
public interface Subject {public void attach(Observer observer); //增加订阅者public void detach(Observer observer); //删除订阅者public void notify(String message); //通知订阅者更新消息 }
- 被观察者实现类
public class SubscriptionSubject implements Subject {private List<Observer> weixinUserlist = new ArrayList<Observer>(); //储存订阅公众号的微信用户@Overridepublic void attach(Observer observer) {weixinUserlist.add(observer);}@Overridepublic void detach(Observer observer) {weixinUserlist.remove(observer);}@Overridepublic void notify(String message) {for (Observer observer : weixinUserlist) {observer.update(message);}} }
- 被观察者接口
- 客户端调用
public class Client {public static void main(String[] args) {SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();//创建微信用户WeixinUser user1=new WeixinUser("杨影枫");WeixinUser user2=new WeixinUser("月眉儿");WeixinUser user3=new WeixinUser("紫轩");//订阅公众号mSubscriptionSubject.attach(user1);mSubscriptionSubject.attach(user2);mSubscriptionSubject.attach(user3);//公众号更新发出消息给订阅的微信用户mSubscriptionSubject.notify("刘望舒的专栏更新了");} }
4. 总结
优点:
- 解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换
缺点:
- 开发效率和运行效率问题。一般采用异步实现
设计模式——行为型模式_观察者模式/发布-订阅模式相关推荐
- 设计模式-观察者模式 发布/订阅模式
设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...
- 每日学习一个设计模式--观察者模式(发布-订阅模式)
定义 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它 ...
- python 设计模式 观察者模式(发布订阅模式)
发布订阅模式 观察者模式应用比较广泛,又被称为"发布-订阅"模式.它用来定义对象间一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新. 问题1 ...
- c#事件的发布-订阅模型_C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命...
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- 点击事件调用匿名函数如何传参_事件发布/订阅模式的简单实现
这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑.事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在.数据通过消息的方式可以灵活的传递. --& ...
- python杂志订阅系统详细设计_从发布-订阅模式谈谈 Flask 的 Signals
发布-订阅模式 发布-订阅模式,顾名思义,就像大家订报纸一样,出版社发布不同类型的报纸杂志不同的读者根据不同的需求预定符合自己口味的的报纸杂志,付费之后由邮局安排人员统一派送. 上面一段话,提到了发布 ...
- ZMQ模式详解——发布/订阅模式
一个例子 1.一个服务器负责生成天气相关数据(邮编.温度.湿度),然后将这些数据发布到所有需要知悉天气的客户端: 2.一个客户端需要时刻更新和获取最新的邮政编码,在没有获取之前可默认为纽约地区. ## ...
- 设计模式 | 观察者模式/发布-订阅模式(observer/publish-subscribe)
定义: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 结构:(书中图,侵删) 一个抽象的观察者接口, ...
- [Vue]非父子组件传值(bus/总线/观察者模式/发布订阅模式)
核心: 在vue原型中挂载vue实例 通过this.bus.$emit('事件名', '参数')向外触发事件和传递参数 在生命周期函数mounted中,通过this.bus.$on('传递出来的事件名 ...
最新文章
- IOS OC项目的单例模式
- 创建虚拟环境和新建工程目录
- oracle数据泵索引创建慢,IMPDP 很慢的原因探究
- 漫步线性代数七——特殊矩阵和应用
- Using Sqoop 1.4.6 With Hadoop 2.7.4
- Nginx负载均衡配置+keepalived高可用
- 区别对待 【找到问题发生的原因】 以及 【关于这个问题的 「正确可行」 的解决方法】
- discuz mysql配置文件_MySQL优化配置文件my.ini(discuz论坛)
- c语言静态变量和静态函数
- 3d人体智能测试软件,三维人体解剖软件(3dbody)
- oracle获取字符的长度的函数,oracle取字符串长度的函数length()和hengthb()
- --set-gitd-purged参数解析
- 平安保险php软件工程师工资,软件工程师
- 递归解决卖桃子问题java
- POJ 1008 玛雅日历
- div 自定义拉宽_纯Css实现Div高度根据自适应宽度(百分比)调整
- vim制作python3编辑器
- 『Transformer』为什么1*1卷积可以替代全连接层?
- Oracle 11gR2新特性--延迟段创建(Deferred Segment Creation)和exp不能导出空表
- Thoth多因子策略
热门文章
- 计算机组成原理中op,计算机组成原理课程习题答案秦磊华
- SpringBoot整合Spring Data Elasticsearch
- linux 进入recovery模式,recovery模式怎么进入,教您recovery模式怎么进入
- 打击标题党 详述清风算法
- 嵌入式自动判断是否插入网线的几种方法
- 全国地图省份联动效果
- android 定时器倒计时,Android CountDownTimer实现定时器和倒计时效果
- Android倒计时定时器CountDownTimer的用法
- 【考研英语语法】口语语法
- 关于初始化数据库时报错及解决办法(常见故障整理)