本节我们来假设这样一个场景:小伙伴们在 C语言中文网提问后,如果指定了老师回答,那么对应的老师就会收到邮件通知,这就是观察者模式的一种应用场景。看到这里,有些小伙伴可能会想到 MQ、异步队列等,其实 JDK 本身就提供了这样的 API。下面我们用代码来还原这样一个应用场景。

首先创建 CLanguage 类,代码如下。

package net.biancheng.c.observer;

import java.util.Observable;

public class CLanguage extends Observable {

private String name = "C语言中文网";

private static final CLanguage CLanguage = null;

private CLanguage() {

}

public static CLanguage getInstance() {

return CLanguage;

}

public String getName() {

return name;

}

public void publishQuestion(Question question) {

System.out.println(question.getUserName() + "在" + this.name + "上提交了一个问题。");

setChanged();

notifyObservers(question);

}

}

java.util.Observable 类和 java.util.Observer 接口在《观察者模式详解》中的模式扩展部分介绍。

然后创建问题 Question 类。

package net.biancheng.c.observer;

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;

}

}

接着创建老师 Teacher 类,代码如下。

package net.biancheng.c.observer;

import java.util.Observable;

import java.util.Observer;

public class Teacher implements Observer {

private String name;

public Teacher(String name) {

this.name = name;

}

public void update(Observable o, Object arg) {

CLanguage CLanguage = (CLanguage) o;

Question question = (Question) arg;

System.out.println("======================");

System.out.println(name + "老师,你好!\n" +

"您收到了一个来自" + CLanguage.getName() + "的提问,希望您解答。问题内容如下:\n" +

question.getContent() + "\n" +

"提问者:" + question.getUserName());

}

}

最后编写客户端测试代码如下。

package net.biancheng.c.observer;

public class Test {

public static void main(String[] args) {

CLanguage cLanguage = CLanguage.getInstance();

Teacher yan = new Teacher("严");

Teacher xie = new Teacher("解");

cLanguage.addObserver(yan);

cLanguage.addObserver(xie);

//用户行为

Question question = new Question();

question.setUserName("张三");

question.setContent("观察者模式适用于哪些场景?");

cLanguage.publishQuestion(question);

}

}

运行结果如下。

张三在C语言中文网上提交了一个问题。

======================

解老师,你好!

您收到了一个来自C语言中文网的提问,希望您解答。问题内容如下:

观察者模式适用于哪些场景?

提问者:张三

======================

严老师,你好!

您收到了一个来自C语言中文网的提问,希望您解答。问题内容如下:

观察者模式适用于哪些场景?

提问者:张三

java 通知_基于Java API实现通知机制相关推荐

  1. java比价_基于JAVA的慢慢买比价网api调用代码实例

    基于JA V A的慢慢买比价网api调用代码实例 代码描述:基于JA V A的慢慢买比价网api调用代码实例 代码平台:聚合数据 import java.io.BufferedReader; impo ...

  2. 租车java 查询_基于java实现租车管理系统

    概述 基于java + swing + JFrame 的图书馆管理系统,租车,还车,管理员管理用户,付款等. 部分代码 public class Login extends JFrame { priv ...

  3. 抽奖功能java开发_基于Java实现抽奖系统

    摘要:这篇Java开发技术栏目下的"基于Java实现抽奖系统",介绍的技术点是"抽奖系统.Java.抽奖.基于.系统.实现",希望对大家开发技术学习和问题解决有 ...

  4. java魔塔_基于java的魔塔游戏的设计与实现论文.docx

    毕业设计(论文)题目: 基于java的魔塔游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.了解和运用Java面向对象的特性: 2.熟练掌握模块化设计的思想,锻炼使用java语言的能力: ...

  5. 医院医生评价的java代码_基于JAVA的医院信息查询接口调用代码实例

    基于JAVA的医院信息查询接口调用代码实例 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io ...

  6. 物联网 云端java架构_基于java的物联网架构实现

    基于java的多设备类型物联网架构实现 前言:19年11月开始从 [金融]行业转 [物联网],路途坎坷,一个人摸索前进,不过也学到了很多新的东西,交了很多好朋友,在此感谢各位! 以下是一些经验分享,希 ...

  7. 图像分割的java程序_基于java的图像分割(数字图像处理)

    [实例简介] 基于java的图像分割(数字图像处理),程序中包含 全局阈值分割,Roberts边缘检测分割,灰度图像,直方图. [实例截图] [核心代码] ImageProcess └── Image ...

  8. hannoi塔java程序_基于Java实现的Hannoi汉诺塔自动演示程序

    1 设计要求 设计GUI界面的Hannoi塔.汉诺塔中有三个座,名字分别为A,B,C.初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上.用户可以用鼠标选中盘子,然 ...

  9. 21点 小游戏 java代码_基于Java的21点扑克游戏的实现

    在上次写的比较牌点的扑克游戏上Java扑克游戏(多人多牌数比较游戏)的实现中,添加21点游戏规则,实现21点牌类游戏.具体实现步骤如下:[需要源代码的留QQ,大家一起探讨探讨哈,谢谢啦!] 抽象出规则 ...

最新文章

  1. 2019-3:时间飞逝
  2. java反射类带构造函数_java中反射类的加载和构造函数
  3. 《101 Windows Phone 7 Apps》读书笔记-Silly Eye
  4. android修改系统设置权限_安卓保护隐私利器!完美解决软件「不给权限就不运行」的小工具...
  5. 日照智能化乳品产业园签约 农民丰收节交易会对话乡村振兴
  6. Netflix:通过可视化和统计学改进用户QoE
  7. js中怎么写自执行函数
  8. vue 左侧菜单隐藏_vue.js 左侧二级菜单显示与隐藏切换的实例代码
  9. 国防科大计算机研究生院,国防科大计算机学院在读硕士的程序人生!
  10. 系统权限控制设计001---RBAC用户角色权限设计方案
  11. js 台阶有n级_乔欣这是“开眼角”了?只在眼妆中多加这一步,整个人变美了N倍...
  12. Ubuntu 18.04 安装 CUDA
  13. QQ sdk和Android sdk 28的兼容处理
  14. netstat 查看网络连接、路由表、接口状态、端口信息
  15. VARCHART XGantt用户手册:如何甘特图中的数据表
  16. 【OpenCV】基于Qt的“破产版”全能扫描王
  17. 该内存不能为written或read的解决方案(比较全)
  18. 干货:制造业中的机械智能(内附完整PPT)
  19. pci 1751 java_PCI-1751快速安装使用手册.PDF
  20. #define定义宏常量和宏函数

热门文章

  1. 右键文件夹用某个软件打开
  2. python错误Errors与异常Exceptions
  3. canvas详细入门教程(1W字 吐血分享)
  4. PyQt5 随笔:信号与槽的两种使用方法:@pyqtSlot() 和 connect()
  5. mysql测试死锁_mysql死锁几种情况的测试_MySQL
  6. 代码经验分享 计算机毕业设计之Python+Vue.js机器学习求职招聘推荐系统 求职招聘数据分析
  7. python查找某一目录下的前缀相同的文件并移动到指定目录, 目录下会有不同前缀的文件, 不同前缀的文件移动到不同目录 举个例...
  8. Linux NetCore下Pdf转图片 内存溢出
  9. java 输出文件到mac路径_javamac的文件路径怎么写
  10. mac中html绝对路径怎么写,mac查看路径