利用JDK方式和GuavaAPI方式实现观察者模式

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 + ‘\‘‘ +
                ‘}‘;
    }
}
 1 package com.gupao.jay.pattern.observer.jdk;
 2
 3 import java.util.Observable;
 4 import java.util.Observer;
 5
 6 /**
 7  * @Author JAY
 8  * @Date 2019/6/2 8:40
 9  * @Description 等待的顾客
10  **/
11 public class Consumer implements Observer {
12
13     public Consumer(int number) {
14         this.number = number;
15     }
16
17     private int number;
18
19     public int getNumber() {
20         return number;
21     }
22
23     public void setNumber(int number) {
24         this.number = number;
25     }
26
27     @Override
28     public void update(Observable o, Object arg) {
29         NumberModel numberModel = (NumberModel) arg;
30         if (numberModel.getNumber() != this.number){
31             System.out.println("号码不匹配,继续等待。。。。");
32             return;
33         }
34         System.out.println("排到我们了,前往" + numberModel.getDeskType() + "用餐");
35     }
36 }
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实现案例需求:模拟在社区中,学生向老师提问。

 1 package com.gupao.jay.pattern.observer.guava;
 2
 3 /**
 4  * @Author JAY
 5  * @Date 2019/6/2 9:11
 6  * @Description 问题
 7  **/
 8 public class Question {
 9
10     private String userName;
11     private String content;
12
13     public String getUserName() {
14         return userName;
15     }
16
17     public void setUserName(String userName) {
18         this.userName = userName;
19     }
20
21     public String getContent() {
22         return content;
23     }
24
25     public void setContent(String content) {
26         this.content = content;
27     }
28 }
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());
    }
}

  

 1 package com.gupao.jay.pattern.observer.guava;
 2
 3 import com.google.common.eventbus.EventBus;
 4
 5 /**
 6  * @Author JAY
 7  * @Date 2019/6/2 9:11
 8  * @Description TODO
 9  **/
10 public class GuavaTest {
11     public static void main(String[] args) {
12         Question question = new Question();
13         question.setUserName("JayNing");
14         question.setContent("如何阅读spring源码?");
15
16         Teacher tom = new Teacher("Tom");
17         Teacher mic = new Teacher("Mic");
18
19         EventBus eventBus = new EventBus();
20         eventBus.register(tom);
21         eventBus.register(mic);
22         eventBus.post(question);
23     }
24 }


原文地址:https://www.cnblogs.com/ningJJ/p/10962303.html

时间: 2024-11-08 20:29:04

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

远程服务器存储之JDK的get请求方式

一.HTTP协议 1.超文本传输协议 2.支持客户端/服务器端模式 3.内容 1-请求协议 1>请求报文格式 1>-请求行:请求方式  请求资源名  协议版本号; 2>-请求消息头 3>-请求体 2>请求方式 1>-POST:请求内容在请求体里,以键=值的形式,键值对之间用&间隔;长度不受限制,保密性高. 2>-GET:请求内容在URL后面用?开始,以键=值的形式,键值对之间用&间隔:请求报文没有请求体:请求数据的长度受到浏览器的限制:请求数据保密

数据存储——远程服务器存储——JDK的get请求方式

一.HTTP协议 1.超文本传输协议 2.支持客户端/服务器端模式 3.内容 1-请求协议 1>请求报文格式 1>-请求行:请求方式  请求资源名  协议版本号; 2>-请求消息头 3>-请求体 2>请求方式 1>-POST:请求内容在请求体里,以键=值的形式,键值对之间用&间隔;长度不受限制,保密性高. 2>-GET:请求内容在URL后面用?开始,以键=值的形式,键值对之间用&间隔:请求报文没有请求体:请求数据的长度受到浏览器的限制:请求数据保密

ubuntu 安装jdk 的两种方式

ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa/源方式安装 1.添加ppa sudo add-apt-repository ppa:webupd8team/javasudo apt-get update 2.安装oracle-java-installer jdk7 sudo apt-get install oracle-java7-insta

android利用jdk制作签名

Apk签名首先要有一个keystore的签名用的文件. keystore是由jdk自带的工具keytool生成的.具体生成方式参考一下: 开始->运行->cmd->cd 到你安装的jdk的目录这里我是 C:\Program Files\Java\jdk1.6.0_10\bin 然后输入:keytool -genkey -alias lvmama.keystore -keyalg RSA -validity 10000 -keystore lvmama.keystore 下面解释下签名的参

006_03Java解析XML之DOM方式与SAX方式

XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX:Simple API for XML.这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它. XML解析开发包 JAXP:是SUN公司推出的解析标准实现. Dom4J:是开源组织推出的解析开发包. JDom:是开源组织推出的解析开发包. JAXP: JAXP:(Java API for XML Proc

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

应掌握内容:1. AOP的全名2. AOP的实现原理[静态代理和动态代理]3. 注解方式的配置4. 通知类型     A. 每种通知的特点和使用方式    B. 获取各种数据,方便日后操作5. 执行表达式的方式6. XML方式的配置7. 如何加载属性文件和注意事项8. 如何引入资源文件,为什么只用引入资源文件 AOP的概念: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是

工作/管理-生活方式:生活方式(各个民族、阶级和社会群体的生活模式)

ylbtech-工作/管理-生活方式:生活方式(各个民族.阶级和社会群体的生活模式) 生活方式狭义指个人及其家庭的日常生活的活动方式,包括衣.食.住.行以及闲暇时间的利用等.广义指人们一切生活活动的典型方式和特征的总和.包括劳动生活.消费生活和精神生活(如政治生活.文化生活.宗教生活)等活动方式.由生产方式所决定,生产方式不仅是生活必需资料的生产和人们肉体存在的再生产,而且“在更大程度上是这些个人的一定的活动方式,是他们表现自己生活的一定方式.他们的一定的生活方式. 1.返回顶部 1. 中文名:

[转帖][思路/技术]Mimikatz的多种攻击方式以及防御方式

[思路/技术]Mimikatz的多种攻击方式以及防御方式 https://bbs.ichunqiu.com/thread-53954-1-1.html 之前学习过 抄密码 没想到还有这么多功能. 挖低危的清风i春秋作家 发表于 7 天前01372 本帖最后由 春风得意水先知 于 2019-9-25 23:50 编辑 Mimikatz的多种攻击方式以及防御方式 Mimikatz的简介:     Mimikatz为法国人Benjamin Delpy编写的一款轻量级的调试工具,在内网渗透过程中,它多数

Post方式与Get方式比较

在学习爬虫的过程了解到了在访问服务器时,有两种请求的方式,Post方式和Get方式 Post方式:向指定的资源提交要被处理的数据 Get方式:从指定的资源请求数据. GET 方法 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2 有关 GET 请求的其他一些注释: GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时