1、JDK方法实现案例需求:

去餐厅吃饭有时候需要排队,进行排队叫号。假如所有等待的人都是观察者,叫号系统就是一个被监听的主题对象。
当叫号系统发出叫号通知后,所有等待的人,都会收到通知,然后检查自己的号码是否匹配。匹配的话,就开始就餐,
不匹配的,继续等待
package com.gupao.jay.pattern.observer.jdk;

/**
* @Author JAY
* @Date 2019/6/2 8:41
* @Description 排队的号码
**/
public class NumberModel { private int number;
private String deskType; public NumberModel(int number, String deskType) {
this.number = number;
this.deskType = deskType;
} public int getNumber() {
return number;
} public void setNumber(int number) {
this.number = number;
} public String getDeskType() {
return deskType;
} public void setDeskType(String deskType) {
this.deskType = deskType;
} @Override
public String toString() {
return "NumberModel{" +
"number=" + number +
", deskType='" + deskType + '\'' +
'}';
}
}
 package com.gupao.jay.pattern.observer.jdk;

 import java.util.Observable;
import java.util.Observer; /**
* @Author JAY
* @Date 2019/6/2 8:40
* @Description 等待的顾客
**/
public class Consumer implements Observer { public Consumer(int number) {
this.number = number;
} private int number; public int getNumber() {
return number;
} public void setNumber(int number) {
this.number = number;
} @Override
public void update(Observable o, Object arg) {
NumberModel numberModel = (NumberModel) arg;
if (numberModel.getNumber() != this.number){
System.out.println("号码不匹配,继续等待。。。。");
return;
}
System.out.println("排到我们了,前往" + numberModel.getDeskType() + "用餐");
}
}
package com.gupao.jay.pattern.observer.jdk;

import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.locks.Lock; /**
* @Author JAY
* @Date 2019/6/2 8:42
* @Description 叫号系统
**/
public class CallNumberSystem extends Observable { private CallNumberSystem(){} private static CallNumberSystem callNumberSystem = null; public static CallNumberSystem getInstance(){
if (callNumberSystem == null){
synchronized (CallNumberSystem.class){
if (callNumberSystem == null){
callNumberSystem = new CallNumberSystem();
}
}
}
return callNumberSystem;
} public void notifyNumber(NumberModel numberModel){
System.out.println("系统播报:请" + numberModel.getNumber() + "号顾客到" + numberModel.getDeskType() + "就餐!");
setChanged();
notifyObservers(numberModel);
}
}
package com.gupao.jay.pattern.observer.jdk;

/**
* @Author JAY
* @Date 2019/6/2 8:55
* @Description TODO
**/
public class CallNumberSystemTest { public static void main(String[] args) {
Consumer consumerA = new Consumer(10001);
Consumer consumerB = new Consumer(10002);
Consumer consumerC = new Consumer(10003); CallNumberSystem instance = CallNumberSystem.getInstance();
instance.addObserver(consumerA);
instance.addObserver(consumerB);
instance.addObserver(consumerC); instance.notifyNumber(new NumberModel(10002,"小桌A11号")); } }

2、guavaAPI实现案例需求:模拟在社区中,学生向老师提问。

 package com.gupao.jay.pattern.observer.guava;

 /**
* @Author JAY
* @Date 2019/6/2 9:11
* @Description 问题
**/
public class Question { private String userName;
private String content; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}
package com.gupao.jay.pattern.observer.guava;

import com.google.common.eventbus.Subscribe;

/**
* @Author JAY
* @Date 2019/6/2 9:05
* @Description TODO
**/
public class Teacher { private String name; public Teacher(String name) {
this.name = name;
} @Subscribe
public void subscribe(Question question){
//业务逻辑
System.out.println(this.name + "老师,学生" + question.getUserName() + "向你提了一个问题,问题的内容是:" + question.getContent());
}
}

  

 package com.gupao.jay.pattern.observer.guava;

 import com.google.common.eventbus.EventBus;

 /**
* @Author JAY
* @Date 2019/6/2 9:11
* @Description TODO
**/
public class GuavaTest {
public static void main(String[] args) {
Question question = new Question();
question.setUserName("JayNing");
question.setContent("如何阅读spring源码?"); Teacher tom = new Teacher("Tom");
Teacher mic = new Teacher("Mic"); EventBus eventBus = new EventBus();
eventBus.register(tom);
eventBus.register(mic);
eventBus.post(question);
}
}
												

利用JDK方式和GuavaAPI方式实现观察者模式的更多相关文章

  1. [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面

    原文:[ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面 随着最终用户对用户体验需求的不断提高,实际上我们很多情况下已经在按照桌面应用的标准来设计Web应用,甚至很多Web页面本身就 ...

  2. 从0开始:Windows内核利用的另一种方式

    https://www.anquanke.com/post/id/91063 从0开始:Windows内核利用的另一种方式 阅读量    9168 |   稿费 200   分享到: 发布时间:201 ...

  3. 代理模式:利用JDK原生动态实现AOP

    代理模式:利用JDK原生动态实现AOP http://www.cnblogs.com/qiuyong/p/6412870.html 1.概述 含义:控制对对象的访问. 作用:详细控制某个(某类)某对象 ...

  4. 利用JDK自带工具keyTool生成安全证书

    前言:说一下最近做的工作,主要利用iText给网页中生成好的html报表转化为pdf格式的文件,并且在其中加入水印,数字签名等等,这部分主要介绍安全证书的目的就是为了做数字签名部分用的. 下面利用jd ...

  5. Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)

    不多说,直接上干货! 福利每天都有  =>  =>=>=>=> 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师  ...

  6. boost::ASIO的同步方式和异步方式

    http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...

  7. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  8. Spring中的AOP注解方式和XML方式

    应掌握内容:1. AOP的全名2. AOP的实现原理[静态代理和动态代理]3. 注解方式的配置4. 通知类型     A. 每种通知的特点和使用方式    B. 获取各种数据,方便日后操作5. 执行表 ...

  9. [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...

随机推荐

  1. python3基础之“小练习(2)”

    (十三)创建一个你最喜欢歌手的列表. # singer=list() # singer=['a','b','c'] # print(singer) (十四)创建一个由元组构成的列表,每个元组包含居住过 ...

  2. HTML Marquee跑马灯

    Marquee是html的标签,所有的主流浏览器都能兼容,用于创建文字滚动. 来介绍下标签的属性 滚动方向 direction <!--滚动方向 direction 4个值 up down le ...

  3. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  4. live555的使用(转载)

    Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码格式的音视频数据的流 ...

  5. CDN详解

    一.定义 背景: 当下的互联网应用都包含大量的静态内容,但静态内容以及一些准动态内容又是最耗费带宽的,特别是针对全国甚至全世界的大型网站,如果这些请求都指向主站的服务器的话,不仅是主站服务器受不了,单 ...

  6. Linux的网络不通流程

    a:xshell连不上的问题第一步:检查网络适配器,是否禁用vmware的虚拟机网卡第二步:检查vmware net8的地址是否为10.0.0.1第三步:检查系统的vmware服务是否启动第四步:检查 ...

  7. django图片上传修改图片名称

    storage.py # 给上传的图片重命名 from django.core.files.storage import FileSystemStorage from django.http impo ...

  8. 2019.7月-前端面试总结(H5+C3+JS+ES6+Vue+浏览器)

    第二次面试 HTML HTML5中的新标签,举例一下 canvas绘画,本地离线存储localStorage,sessionStorage,video和audio元素,语义化元素,表单类型(date, ...

  9. mysql数据库备份,主从复制及半同步复制

    1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-dat ...

  10. SCADA系统构架的安全分析总结

    概念: SCADA 数据采集与监控 Supervisory Control And Data Acquisition  .包括了计算机设备  工业控制组件    网络 组成部件 ,SCADA 系统被用 ...