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. 在js中把json中的 key去掉双引号的方法

    方法一: //数据格式是这样的: var data = '[{"id":30348079,"name":"表1","score&q ...

  2. 【kafka】一键启动kafka脚本

    3.1 创建文件cd bin 跳转到bin文件夹里touch  start-kafka-cluster.sh --新建一键启动文件touch  stop-kafka-cluster.sh --新建一键 ...

  3. Linux Shell 小数比较

    #!/bin/bash #######expr 方法是错误的,在比较相同位数时可以,当位数不同就会出错,如100.00>70.00就会得出错误的结果 a=123b=123c=99.99rat=` ...

  4. 加密类型、数据加密解密过程以及CA创建

    对称加密算法 对称加密:加密和解密使用同一个密钥 DES:Data Encryption Standard,56bits 3DES: AES:Advanced (, , 256bits) Blowfi ...

  5. C++中string::find()函数和string::npos函数的使用

    1. string::find()函数和string::npos函数的介绍 我们在学习C++的时候必不可少的使用到string类中的find()函数,它是一个查找函数,功能还是很强大的,但是此处我们不 ...

  6. MongoDB的关闭

    关闭 1,非后台运行时,关闭对话,或者ctrl+c 2,登录数据库执行:db.shutdownServer(); 3,带数据目录,关闭服务器,安全   mongod --shutdown --dbpa ...

  7. java加密算法-DES

    public class DESUtil { private static String strdefaultkey = "13456789abcd";//默认的key priva ...

  8. Spring4- 04-Spring简易整合Mybatis -导入jar包/ 正常编写pojo/ 编写spring 配置文件

    笔记要点&出错分析与总结 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,工程组织   (AirportService为机场 ...

  9. JQuery的入门(二)

    Jquery的遍历 jQuery对象本身就是数组对象,通过jquery选择器获得的都是满足该选择器条件的元素对象的集合体,因此在常常需要对jquery对象进行遍历.这里有三种遍历Jquery的方法. ...

  10. memcached的缺点

    上篇博客说了为什么引入memcached,主要讲述了memcached的优点,接下来就是我们在使用中必须要注意的内容,memcached的缺点,只有正确认识它,才能运用自如,接下来先看一下memcac ...