基于Java API实现通知机制
本节我们来假设这样一个场景:小伙伴们在 新宝库提问后,如果指定了老师回答,那么对应的老师就会收到邮件通知,这就是观察者模式的一种应用场景。看到这里,有些小伙伴可能会想到 MQ、异步队列等,其实 JDK 本身就提供了这样的 API。下面我们用代码来还原这样一个应用场景。
首先创建 CLanguage 类,代码如下。
首先创建 CLanguage 类,代码如下。
package net.biancheng.c.observer; import java.util.Observable; public class CLanguage extends Observable { private String name = "新宝库"; 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语言项目案例
- 数据结构
- 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
- 大数据
- 云计算