定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

源码地址:https://gitee.com/yang-kairui/design-pattern
JAVA的JDK和很多框架都用到了观察者模式,最典型的比如说spring mvc中的DispatcherServelet以及Zookeeper的动态监控注册中心,感兴趣的话可以去阅读一下源码

如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:

1、服务号就是主题,业务就是推送消息

2、观察者只需要订阅主题,只要有新的消息就会送来

3、当不想要此主题消息时,取消订阅

4、只要服务号还在,就会一直有人订阅

好了,现在我们来看看观察者模式的类图:

接下来就是代码时间了,我们模拟一个买彩票的场景,彩票站就是主题,买彩票的人就是观察者。

首先定义两个接口,主题接口Subject、订阅者接口Observer

/*** 所有的被观察主题需要实现该接口** @author ykr* @date 2022/3/31*/
public interface Subject {/*** 存储所有观察者* @return List<Observer>*/List<Observer> getObservers();/*** 注册一个观察者* @param observer 订阅的观察者对象*/void registerObserver(Observer observer);/*** 移除一个观察者* @param observer 订阅的观察者对象*/void removeObserver(Observer observer);/*** 通知所有观察者*/void notifyObservers();
}
/*** 所有订阅者需要实现该接口** @author ykr* @date 2022/3/31*/
public interface Observer {void update(String msg);
}

接下来实现一个彩票主题LotterySubject 和彩民订阅者LotteryHolders

/*** 彩票主题** @author ykr* @date 2022/3/31*/
public class LotterySubject implements Subject {/*** 所有买彩票的彩民*/private List<Observer> observers = new ArrayList<>();/*** 开奖号码*/private String msg;@Overridepublic List<Observer> getObservers() {return this.observers;}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {int index = observers.indexOf(observer);if (index >= 0) {observers.remove(observer);}}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(msg);}}/*** 开奖*/public void lottery(String msg) {this.msg = msg;notifyObservers();}
}
/*** 持有彩票的人** @author ykr* @date 2022/3/31*/
public class LotteryHolders implements Observer {private String lottery;LotteryHolders(String lottery) {this.lottery = lottery;}@Overridepublic void update(String msg) {//开奖System.out.println("本期开奖号码:" + msg + ",我的号码:" + lottery);}
}

最后模拟买彩票案例LotteryTest

/*** 买彩票模拟** @author ykr* @date 2022/3/31*/
public class LotteryTest {public static void main(String[] args) {LotteryHolders li = new LotteryHolders(String.valueOf(new Random().nextInt(10)));LotteryHolders wang = new LotteryHolders(String.valueOf(new Random().nextInt(10)));LotteryHolders yang = new LotteryHolders(String.valueOf(new Random().nextInt(10)));LotterySubject lotteryStore = new LotterySubject();lotteryStore.registerObserver(li);lotteryStore.registerObserver(wang);lotteryStore.registerObserver(yang);lotteryStore.lottery("5");}
}

执行结果

本期开奖号码:5,我的号码:4 本期开奖号码:5,我的号码:9 本期开奖号码:5,我的号码:7

23种设计模式JAVA案例

JAVA观察者模式(买彩票案例)相关推荐

  1. java初学者买衣服案例

    package feicuicii; import java.util.Scanner; public class maiyifi { public static void main(String[] ...

  2. Java实现 蓝桥杯VIP 算法提高 阮小二买彩票

    算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否 ...

  3. JAVA 蓝桥杯 算法提高 阮小二买彩票

    JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...

  4. Java版的双色球买彩票程序

    Java版的双色球买彩票程序 package HelloWord;import java.util.Scanner;import java.util.Random;//双色球游戏public clas ...

  5. 蓝桥杯 算法提高VIP 阮小二买彩票 (Java解题)

    题目描述 在同学们的帮助下,阮小二是变的越来越懒了,  连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户的钱增长好慢啊,碰 ...

  6. 蓝桥 阮小二买彩票(Java)

    AILAB专项训练 问题描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户 ...

  7. Java基础(29)线程与进程、并发与并行、多线程的三种启动方式、买票案例

    1. 进程与线程 1. 进程与线程的概述: (1)进程: 进程就是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有他自己的内存空间和系统资源 比如正在运行的应用程序(QQ,微信,QQ ...

  8. java双色球实现买彩票与开奖

    java双色球实现买彩票与开奖 需求: 双色球投注区分为红色球号码区和蓝色球号码区, 红色球号码区由1-33共33个号码组成,蓝色球号码区由1-16共16个号码组成. 投注时选择6个红球号码和1个蓝球 ...

  9. 蓝桥杯算法提高-阮小二买彩票问题(Java语言)

    描述        在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户的钱增长好慢 ...

  10. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

最新文章

  1. skill alpha protocol
  2. sql随机抽取数据50条_厉害!苏宁通过citus打造分布式数据库抗住DB高负载
  3. 关于Java Collections Framework的一些总结(2)
  4. Oracle 11g系统自动收集统计信息的一些知识
  5. JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)
  6. Vue.js实现可配置的登录表单
  7. C++ 传递指针给函数
  8. 第四部分 在configure.in中使用宏来检测
  9. jsp实现简单购物车页面
  10. 【敏捷2.2】极限编程XP
  11. 弘辽科技:农夫山泉溜到了下坡路
  12. Java基础算法,获得相反数
  13. Gartner:2017年存储技术成熟度曲线
  14. 安装snipe-IT遇到的php问题
  15. Mask R-CNN 训练自己的数据集—踩坑与填坑
  16. php unlink权限设置,php中删除文件用unlink函数权限判断
  17. 机器人“嘚瑟”怎么办?用加速度指令“hold”住它!
  18. 如何打开虚拟机服务器,虚拟机怎么打开ssh服务器
  19. 关于JAVA中的可变形参(多个参数)
  20. 邦彦技术上市首日跌15%:公司市值37亿 劲牌是二股东

热门文章

  1. C语言学习-翁凯(第三章笔记)
  2. 华为云虚拟服务器怎么搭建,云服务器怎么搭建虚拟主机
  3. ora 01033 linux,数据库ORA-01033错误解决办法
  4. 01背包与完全背包详解
  5. 搭建petalinux开发环境
  6. 专业抠图软件Super PhotoCut Pro for Mac
  7. 格志AK890打印驱动安装
  8. 微信小程序开发文档-萧然 8.28
  9. 【Proteus仿真】BME280温湿度气压传感器数据串口输出
  10. 浙江大学计算机专业介绍,浙江大学计算机科学与技术专业课程设置