本节我们来假设这样一个场景:小伙伴们在 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. JAVA 反射知识点总汇
  2. 被动信息收集之RECON-NG(七)
  3. Objective-C语法之Object对象的那些事儿(五)
  4. 广西区计算机一级考试操作题,全国高校计算机等级考试(广西考区)一级笔试试题卷.doc...
  5. GIMP 2.10教程
  6. IE 8 下面的垂直水平居中
  7. 自媒体这个行业看似门槛很低,但是赚到钱的人,也是少数,为什么呢?
  8. JS之Date对象和获取系统当前时间
  9. 赛尔原创 | ACL20 用于多领域端到端任务型对话系统的动态融合网络
  10. 中国历史上成功的两人合作, 改进, 提高的例子
  11. nfc卡模式与标准模式_马苏开启年后减肥模式,素颜自拍打卡,皮肤光滑香汗淋漓惹人注目...
  12. 计算机科学导论5版答案,5计算机科学导论习题答案.doc
  13. Pentest Wiki Part4 后渗透(二)
  14. 展锐sc8541E多媒体网络摄像播放-液晶驱动一体板
  15. 网站被黑被劫持跳转的症状与木马代码清除
  16. vue实现浏览器桌面通知
  17. 【ME909】华为ME909 4G LTE模块在树莓派下通过minicom进行发送短信演示
  18. android wear iphone7,多款Android Wear手表不兼容苹果iPhone7
  19. mongodb的分组求和(使用aggregate方法)
  20. 郭德纲相声里的插入广告

热门文章

  1. python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(四)
  2. (转载)Linux一句话精彩-1
  3. golang post 文字 图片_超简单的图片爬虫,搜集图片分分钟
  4. 想搞定大厂面试官?java读取txt文件并存入数组
  5. python点触图形验证码识别_GitHub - AaronJny/captcha_detection: 点选式验证码识别方案...
  6. Elasticsearch从入门到放弃:文档CRUD要牢记
  7. 「推荐系统从0到1」服务发现
  8. 看上去很美的开发者大会——极路由背后的尴尬
  9. 2022-4-11 修改TCP发送缓冲区大小
  10. 2022-4-2 Leetcode 1588.所有奇数长度子数组的和