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. TweenMax—ScrambleText插件 实现类似电脑破译密码的特效

    首先贴一下TweenMax的中文网:https://www.tweenmax.com.cn/ 首先先展示一下最后的效果,需要的就继续看下去: 那团乱码是会一直变的 那么如何实现上图的效果呢??? 其实 ...

  2. DML 操作表中数据

    DML 是对于表中的记录进行增删改操作 一.添加数据   语法格式: insert into 表名[字段名] values[字段值]      表名:表示往那张表中添加数据   (字段名1,字段名2, ...

  3. QString 转 LPCWSTR

    遍历文件的时候遇到的一个问题,百度了好久才搞定,这个是可用的,所以总结下来. QString 转 LPCWSTR QString path1 = path + "\\*"; con ...

  4. 在线生成二维码API接口

    1.http://s.jiathis.com/qrcode.php?url=kk 2.http://qr.liantu.com/api.php?text=kk 3.http://api.k780.co ...

  5. ArcEngine二次开发中运行出现There is no Spatial Analyst license currently available or enabled.

    只需要在许可控件上勾选空间分析功能即可.

  6. linux后台运行、关闭、查看后台任务常用命令

    一.& 加在一个命令的最后,可以把这个命令放到后台执行,如: [root@bqh-01 ~]# watch -n 3 "sh 1.sh"  #每3s在后台执行一次1.sh脚 ...

  7. RabbitMQ topic 交换器

    topic交换器:"."将路由键分为几个标识符,"*"匹配一个, "#"可以匹配多个 1:路由键为*或者#的时候 *:只能匹配单个的字符串 ...

  8. 大数据集群Linux CentOS 7.6 系统调优篇

    大数据集群Linux CentOS 7.6 系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置主机hosts文件 1>.修改主机名 [root@node100 ...

  9. SpringCloud_Eureka与Zookeeper对比

    关系型数据库与非关系型数据库及其特性: RDBMS(Relational Database Management System 关系型数据库) :mysql/oracle/sqlServer等   = ...

  10. python __main__ 里的变量是全局变量 因此在函数里面可以访问到

    __main__ and scoping in python from:https://stackoverflow.com/questions/4775579/main-and-scoping-in- ...