基于Java API实现通知机制
本节我们来假设这样一个场景:小伙伴们在 C语言中文网提问后,如果指定了老师回答,那么对应的老师就会收到邮件通知,这就是观察者模式的一种应用场景。看到这里,有些小伙伴可能会想到 MQ、异步队列等,其实 JDK 本身就提供了这样的 API。下面我们用代码来还原这样一个应用场景。
首先创建 CLanguage 类,代码如下。
首先创建 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); } }
然后创建问题 Question 类。java.util.Observable 类和 java.util.Observer 接口在《观察者模式详解》中的模式扩展部分介绍。
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语言中文网的提问,希望您解答。问题内容如下:
观察者模式适用于哪些场景?
提问者:张三
编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。
通俗易懂,深入浅出,一篇文章只讲一个知识点。
文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
文章不涉及代码,不烧脑细胞,人人都可以学习。
当你决定关注「编程帮」,你已然超越了90%的程序员!

微信扫描二维码关注
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算
- 编程笔记
- 资源下载
- VIP视频
- 一对一答疑
- 关于我们