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. 下载css-loader 安装及使用

    1.通过require的方式来引入css,我们来看具体的方法,首先需要安装css-loader, style-loader(安装style-loader的目的是为了在html中以style的方式嵌入c ...

  2. vs code 调试设置

    首先vs code 安装插件:Debugger for Chrome vscode 设置:点击调试按钮,然后调试面板界面再点击设置按钮,添加一个配置,选择环境为:chrome编辑器自动生成一个laun ...

  3. Python——结束语句

    条件语句: break 结束语句,表示达到某个目的后,将结束当前循环语句,break以下的代码都不执行.例如: for i in range(10): print("--------&quo ...

  4. CentOS 7.6最小化安装(系统盘和数据盘分离安装)

    CentOS 7.6最小化安装(系统盘和数据盘分离安装) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建虚拟机 鉴于大家使用的平台操作系统可能不尽相同,博主精力有限,仅演示 ...

  5. :Spring-06 -AOP [面向切面编程] -配置异常通知的两种方式--AspectJ 方式 -Schema-based 方式

    三.配置异常通知的步骤(AspectJ 方式) 1.只有当切点报异常才能触发异常通知 2.在spring 中有AspectJ 方式提供了异常通知的办法 3.实现步骤: 3.1新建类,在类写任意名称的方 ...

  6. tensorflow 与cuda、cudnn的对应版本关系

    来源:https://www.cnblogs.com/zzb-Dream-90Time/p/9688330.html

  7. webpack打包后服务端__dirname失效问题

    在webpack.config.js中添加如下配置: target: 'node', node: { __dirname: false, __filename: false, } 详见:https:/ ...

  8. java中split函数参数特殊字符的处理(转义),如:"." 、"\"、"|"

    内容介绍 本文主要介绍java中特殊字符做为split函数的参数,如:"." ."\"."|",双引号等,不能正确分隔源字符串的处理方法. ...

  9. CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&&bsgs

    题意 设 $$f_i = \left\{\begin{matrix}1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  i < k\\ ...

  10. 2019ICPC南京网络赛B super_log——扩展欧拉定理

    题目 设函数 $$log_a*(x) = \begin{cases}-1, & \text{ if } x < 1 \\ 1+log_a*(log_ax) & \text{ if ...