观察者模式就是当⼀个⾏为发⽣时传递信息给另外⼀个⽤户接收做出相应的处理,两者之间没有直接的耦合关联。
观察者模式分为三大块:
事件监听、事件处理、具体业务流程

例子解析

模拟摇号:

代码结构:

开发中会把主线流程开发完成后,再使⽤通知的⽅式处理辅助流程。他们可以是异步的,在MQ以及定时任务的处理下,保证最终⼀致
性。

事件监听接口定义:

public interface EventListener {void doEvent(LotteryResult result);
}

接口定义基本的事件类

两个监听事件实现:

发送短信的事件:

public class MessageEventListener implements EventListener {private Logger logger = LoggerFactory.getLogger(MessageEventListener.class);public void doEvent(LotteryResult result) {logger.info("给{}发短信{}", result.getuId(), result.getMsg());     }
}

发送MQ的事件:

public class MQEventListener implements EventListener {private Logger logger = LoggerFactory.getLogger(MQEventListener.class);public void doEvent(LotteryResult result) {logger.info("给{}发摇号结果{}", result.getuId(), result.getMsg());     }
}

事件处理类

public class EventManager {Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();public EventManager(Enum<EventType>... operations) {for (Enum<EventType> operation : operations) {this.listeners.put(operation, new ArrayList<>());}}public enum EventType {MQ,Message}/**订阅*eventType : 事件类型*listener : 监听*/public void subscribe(Enum<EventType> eventType, EventListener listener) {List<EventListener> users = listeners.get(eventType);users.add(listener);}/**取消订阅*eventType : 事件类型*listener : 监听*/public void unsubscribe(Enum<EventType> eventType, EventListener listener) {List<EventListener> users = listeners.get(eventType);users.remove(listener);}/**通知*eventType : 事件类型*result : 结果*/public void notify(Enum<EventType> eventType, LotteryResult result) {List<EventListener> users = listeners.get(eventType);for (EventListener listener : users) {listener.doEvent(result);}}
}

实现了三个主要方法:订阅、取消订阅、通知,用于对于监听事件的添加与使用
事件有不同类型,使用枚举方式进行处理,方便外部在规定下使用事件。

业务抽象类接口:

public abstract class LotteryService {public EventManager eventManager;public LotteryService() {eventManager = new EventManager(EventManager.EventType.MQ, EventManager.EventType.Message);eventManager.subscribe(EventManager.EventType.MQ, new MQEventListener());eventManager.subscribe(EventManager.EventType.Message, new MessageEventListener());}public LotteryResult draw(String uId) {LotteryResult lotteryResult = doDraw(uId);// 需要什么通知就调用哪个方法eventManager.notify(EventManager.EventType.MQ, lotteryResult);eventManager.notify(EventManager.EventType.Message, lotteryResult);return lotteryResult;}protected abstract LotteryResult doDraw(String uId);
}

只有调用draw方法才能完成事件通知

业务接口实现类

public class LotteryServiceImpl extends LotteryService {private MinibusTargetService minibusTargetService = new MinibusTargetService();protected LotteryResult doDraw(String uId) {// 摇号String lottery = minibusTargetService.lottery(uId);// 结果return new LotteryResult(uId, lottery, new Date());}
}

结论

将原有流程拆分为核心流程与辅助流程代码。
核心流程一般不会变,辅助流程可能会变。
此设计模式结构上满足开闭原则,需要新增其他监听事件或者修改监听逻辑,不需要改动事件处理类。

观察者模式Java实现相关推荐

  1. 观察者模式/ java实现附代码 /

    /注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...

  2. 设计模式--观察者模式--Java实现

    Subject–>小明–>知道他的观察者(妈妈,女朋友)–>可以添加,删除,通知他的观察者 ConcreteSubject–>天气预报–>各种不同天气状态–>天气改 ...

  3. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  4. 观察者模式java类图_初探Java设计模式------观察者模式

    前言 最近刚开始学习RxJava,众所周知,Rxjava就是扩展的观察者模式,所以想学习Rxjava,先入手了解一下观察者模式是很有必要的.那么今天就先稍微了解一下什么是观察者模式. 定义 观察者(O ...

  5. java设计模式(六)--观察者模式

    转载:设计模式(中文-文字版) 目录: 简单目标任务实现 观察者模式介绍 观察者模式代码实现 观察者模式是JDK中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...

  6. Java 设计模式之观察者模式

    一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...

  7. java 观察者模式示例_观察者设计模式示例

    java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  8. java观察者模式本质_6.[研磨设计模式笔记]观察者模式

    1.定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新. 2.解决问题 --订阅报纸 看起来订阅者是直接根有据打交道,但实际上,订阅者的订阅数据 ...

  9. Java设计模式之行为型:观察者模式

    一.什么是观察者模式: 观察者模式又称为 发布-订阅模式,定义了对象之间一对多依赖关系,当目标对象(被观察者)的状态发生改变时,它的所有依赖者(观察者)都会收到通知.一个观察目标可以对应多个观察者,而 ...

最新文章

  1. addeventlistener事件第三个参数 passive_JS DOM 事件流、事件冒泡
  2. MATLAB工具箱介绍
  3. (8)小白又如何?3分钟搞定一个 C# 知识点
  4. 朴素贝叶斯和贝叶斯估计_贝叶斯估计收入增长的方法
  5. 前端扁平化数据转树形数据_把平级数据变成树形数据
  6. pip换源,解决pip下载超时,连接失败等问题
  7. 6年前的Dubbo,2年前的Spring Cloud,都被这个架构干掉了
  8. 理解 Android 的 ONE_SHOT_MAKEFILE
  9. 给予redis和zookeeper的分布式锁
  10. 关于计算机技术职业资格那些事
  11. STL源码剖析(一)
  12. 斯皮尔曼相关(spearman)系数法
  13. 江苏省淮安市谷歌高清卫星地图下载
  14. 解决TIM版, 精简QQ版本无法修改个人文件夹位置win10,win11通用
  15. 如何在Microsoft Word 2010中创建自定义封面
  16. 公示系统php,企业信用查询公示系统
  17. Docker 部署 FreeIPA 服务
  18. 数据库原理及应用期末复习小结
  19. 转载:理解 VSync
  20. c++做题记录1 01:全面的MyString 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 程序填空,输出指定结果

热门文章

  1. java object对象的方法_Java常见对象Object类中的个别方法
  2. Linux下做一个arp欺骗程序6,LINUX下防ARP欺骗攻击
  3. jquery可见性选择器(综合)
  4. 移动端网页宽度值(未加meta viewport标签)
  5. 视差滚动(Parallax Scrolling)技术在网页中应用的精美案例
  6. HTML 表单 存为EXCEL文件时 中文显示乱码
  7. Android IPC系列(一):AIDL使用详解
  8. spring AOP源码分析(一)
  9. Java on Windows Mobile
  10. Linux内核的启动过程分析