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. dpkg文件缺失问题

    sudo apt-get update 命中:1 http://security.ubuntu.com/ubuntu bionic-security InRelease         命中:2 ht ...

  2. ios开发之NSData

    NSData用于保存字节数组. 初始化 - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length free ...

  3. MySQL Backup--Xtrabackup远程备份和限速备份

    使用xbstream 备份到远程服务器 ##xbstream 备份到远程服务器 innobackupex \ --defaults-file="/export/servers/mysql/e ...

  4. MySQL Hardware--FIO压测

    FIO参数 .txt 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb direct= 测试过程绕过机器自带的buffer,使测试结果更真实 rw= ...

  5. Flink源码阅读(二)——checkpoint源码分析

    前言 在Flink原理——容错机制一文中,已对checkpoint的机制有了较为基础的介绍,本文着重从源码方面去分析checkpoint的过程.当然本文只是分析做checkpoint的调度过程,只是尽 ...

  6. IDRAC 固件升级操:

    Internal Use - Confidential IDRAC 固件升级操作: R630:https://downloads.dell.com/FOLDER05590166M/1/iDRAC-wi ...

  7. WebLogic反序列化漏洞(CVE-2019-2725补丁绕过)

    影响产品: Oracle WebLogic Server10.3.6.0.0 Oracle WebLogic Server12.1.3.0.0 影响组件: wls9_async_response.wa ...

  8. 基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample

    到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...

  9. Spark-2.3.2 HBase BulkLoad

    在大量数据需要写入HBase时,通常有Put方式和BulkLoad两种方式. Put不做解释. BulkLoader方式的优势在于: 1.不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生F ...

  10. 《hello-world》第九次团队作业:【Beta】Scrum meeting 1

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 <hello--wor ...