
设计模式之观察者模式学习笔记
发布日期:2021-05-06 23:31:41
浏览次数:20
分类:精选文章
本文共 2143 字,大约阅读时间需要 7 分钟。
前言
观察者模式,又叫作发布-订阅模式。一般的特点为对象间的关系为一对多,当一个对象被修改的时候,就会通知它依赖的对象
定义
定义对象间一种一对多的依赖关系,每当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新
结构图
角色拆解分析:
举栗实现
我加入了“刘皇叔”的星球,并和球友一起关注了他的微信公众号。每天只要公号有新的技术文发布,我们就能在手机微信收到通知。
1.Observer抽象观察者
定义更新方法
public interface Observer { public void update(String message);}
2.ConcreteObserver具体观察者
我和一大票群友就是这个具体观察者,实现了抽象观察者的更新方法
public class WechatUser implements Observer { private String name; public WechatUser(String name) { this.name = name; } @Override public void update(String message) { System.out.print(name+"-"+message); }}
3.Observer抽象被观察者
提供了增加、删除和通知更新3个方法
public interface Subject { public void attach(Observer observer); public void detach(Observer observer); public void notify(String message);}
4.ConcreteObserver具体被观察者
Android大牛刘望舒就是被观察者,他那存储有关注他的粉丝,实现了抽象方法
public class LiuWangShu implements Subject { //关键代码,用来存放观察者们 private Listlist = new ArrayList<>(); @Override public void attach(Observer observer) { list.add(observer); } @Override public void detach(Observer observer) { list.remove(observer); } @Override public void notify(String message) { for (Observer observer:list){ observer.update(message); } }}
5.客户端调用
public class ObserverClient { public static void main(String []args){ //被观察者 LiuWangShu liuWangShu = new LiuWangShu(); //首先创建几个刘望舒的粉丝 Wechat husky = new Wechat("husky"); Wechat labrador = new Wechat("labrador"); //订阅公号 liuWangShu.attach(husky); liuWangShu.attach(labrador); //通知更新 liuWangShu.notify("今天发文了..."); }}
优缺点对比
优点:
1.观察者、被观察者之间抽象耦合,方便扩展 2.方便建立一套触发机制 缺点: 1.一个被观察者和若干个观察者,java消息通知是顺序执行的,一个观察者卡顿,后面的就gg了。兼顾开发、运行效率,一般采用异步方式使用场景
1.存在关联行为的场景
2.事件多级触发 3.跨系统的消息交换场景,如消息队列、事件总线的处理机制发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月07日 02时48分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
hdu6434 Problem I. Count(数论)(好题)
2019-03-05
NC15553 数学考试(线性DP)
2019-03-05
MySQL两阶段提交、崩溃恢复与组提交
2019-03-05
MySQL隐藏文件.mysql_history风险
2019-03-05
如何通过文件解析MySQL的表结构
2019-03-05
ClickHouse 适用场景调研文档
2019-03-05
C++的编译过程及原理
2019-03-05
Vue——父组件将方法传递给子组件
2019-03-05
文件加密软件对于企业发展而言有何优势?局域网数据防泄密工作应该如何入手?
2019-03-05
Beautiful Soup基础入门
2019-03-05
点击控制盒子移动
2019-03-05
js求阶乘
2019-03-05
小程序图片正确使用方式(防止发布之后不显示)
2019-03-05
C++基础学习笔记08——模板
2019-03-05
Java学习
2019-03-05
Js函数
2019-03-05
Python机器学习算法基础概述
2019-03-05