基于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
- 大数据
- 云计算