观察者模式是一种行为型设计模式,也被称为发布-订阅模式,它定义了一种一对多的依赖关系,当一个对象状态发生改变时,其所有的依赖对象都会得到通知并自动更新。
也就是说让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

ConcreteSubject 继承 Subject;ConcreteObserver 继承 Observer
优缺点:
优点
缺点
举个例子
你是一个实验室负责人,你要给学弟学妹定期留任务
学弟学妹(监听任务通知,收到自动查看)
抽象观察者 Observer
public interface Observer {
// 收到通知后执行更新
void receiveTaskNotice(String taskMsg);
}
抽象主题 Subject
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
// 保存所有订阅的学弟学妹
private List<Observer> studentList = new ArrayList<>();
// 订阅(加学弟)
public void subscribe(Observer observer) {
studentList.add(observer);
}
// 取消订阅(退实验室)
public void unsubscribe(Observer observer) {
studentList.remove(observer);
}
// 广播通知所有人
public void notifyAllStudent(String taskInfo) {
for (Observer stu : studentList) {
stu.receiveTaskNotice(taskInfo);
}
}
}
学长senior
public class SeniorSubject extends Subject {
// 发布任务,自动通知全部订阅学生
public void publishTask(String taskContent) {
System.out.println("学长发布新任务:" + taskContent);
notifyAllStudent(taskContent);
}
}
学弟学妹Student
public class StudentObserver implements Observer {
private String name;
public StudentObserver(String name) {
this.name = name;
}
@Override
public void receiveTaskNotice(String taskMsg) {
System.out.println(name + " 收到任务通知,任务内容:" + taskMsg);
}
}
public class Test {
public static void main(String[] args) {
// 创建发布者:学长
SeniorSubject senior = new SeniorSubject();
// 创建多个学弟学妹,订阅学长通知
Observer stu1 = new StudentObserver("学弟A");
Observer stu2 = new StudentObserver("学妹B");
Observer stu3 = new StudentObserver("学弟C");
senior.subscribe(stu1);
senior.subscribe(stu2);
senior.subscribe(stu3);
// 学长发布任务,所有学生自动收到
senior.publishTask("本周完成设计模式作业,周五提交");
}
}
输出
学长发布新任务:本周完成设计模式作业,周五提交
学弟A 收到任务通知,任务内容:本周完成设计模式作业,周五提交
学妹B 收到任务通知,任务内容:本周完成设计模式作业,周五提交
学弟C 收到任务通知,任务内容:本周完成设计模式作业,周五提交
适用场景
1.发布者与订阅者需要解耦
2.运行时可动态增减监听对象
3.事件回调、消息广播场景
4.无法预知有多少个接收方


