JAVA观察者模式(买彩票案例)
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
源码地址: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观察者模式(买彩票案例)相关推荐
- java初学者买衣服案例
package feicuicii; import java.util.Scanner; public class maiyifi { public static void main(String[] ...
- Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否 ...
- JAVA 蓝桥杯 算法提高 阮小二买彩票
JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...
- Java版的双色球买彩票程序
Java版的双色球买彩票程序 package HelloWord;import java.util.Scanner;import java.util.Random;//双色球游戏public clas ...
- 蓝桥杯 算法提高VIP 阮小二买彩票 (Java解题)
题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户的钱增长好慢啊,碰 ...
- 蓝桥 阮小二买彩票(Java)
AILAB专项训练 问题描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户 ...
- Java基础(29)线程与进程、并发与并行、多线程的三种启动方式、买票案例
1. 进程与线程 1. 进程与线程的概述: (1)进程: 进程就是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有他自己的内存空间和系统资源 比如正在运行的应用程序(QQ,微信,QQ ...
- java双色球实现买彩票与开奖
java双色球实现买彩票与开奖 需求: 双色球投注区分为红色球号码区和蓝色球号码区, 红色球号码区由1-33共33个号码组成,蓝色球号码区由1-16共16个号码组成. 投注时选择6个红球号码和1个蓝球 ...
- 蓝桥杯算法提高-阮小二买彩票问题(Java语言)
描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下来,阮小二发现自己账户的钱增长好慢 ...
- java基础-多线程应用案例展示
java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...
最新文章
- skill alpha protocol
- sql随机抽取数据50条_厉害!苏宁通过citus打造分布式数据库抗住DB高负载
- 关于Java Collections Framework的一些总结(2)
- Oracle 11g系统自动收集统计信息的一些知识
- JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)
- Vue.js实现可配置的登录表单
- C++ 传递指针给函数
- 第四部分 在configure.in中使用宏来检测
- jsp实现简单购物车页面
- 【敏捷2.2】极限编程XP
- 弘辽科技:农夫山泉溜到了下坡路
- Java基础算法,获得相反数
- Gartner:2017年存储技术成熟度曲线
- 安装snipe-IT遇到的php问题
- Mask R-CNN 训练自己的数据集—踩坑与填坑
- php unlink权限设置,php中删除文件用unlink函数权限判断
- 机器人“嘚瑟”怎么办?用加速度指令“hold”住它!
- 如何打开虚拟机服务器,虚拟机怎么打开ssh服务器
- 关于JAVA中的可变形参(多个参数)
- 邦彦技术上市首日跌15%:公司市值37亿 劲牌是二股东