观察者模式(发布-订阅模式)
定义
一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。
主体为观察者和被观察者,被观察者出现变化则通知观察者,然后观察则则进行后续操作。注意,在这里强调被观察者只有一个,而观察者可以有多个,所以这是多对一的依赖关系。
示例和代码
以学校放假为例。每个班有一个班主任,一个班有很多学生,当假期来临,班主任会通知班里所有的学生相关放假事项,而学生收到放假的通知后就会收拾回家。这就是一种观察者模式。
//定义老师的接口。
//一个方法为通知所有学生要放假了;
//一个为给班里新来的学生登记一下,不然老师也记不住有哪些学生需要通知
interface Teacher {
void addStudent();
void notifyStudents();
}
//定义具体的老师:张三老师
class ZhangSan implements Teacher {
private List<Student> myStudents = new ArrayList<>();
@override
public void addStudent(Student student) {
myStudents.add(student);
}
@override
public void notifyStudents() {
myStudent.forEach(studnet -> student.goHome());
}
}
//定义学生的接口,方法为收到通知后需要执行的:收拾回家
interface Student {
void goHome();
}
//定义学生的实现类:李四、王五
class LiSi() implements Studnet {
@override goHome() {};
}
class WangWu() implements Studnet {
@override goHome() {};
}
//调用
public class Main {
public static void main(String[] args) {
//新建老师
Teacher teacher = new ZhangSan();
//新建学生(多个)
Student student1 = new LiSi();
Student student2 = new WangWu;
//老师添加每个学生...
teacher.addStudent(student1);
teacher.addStudent(student2);
//老师通知学生,然后学生回家
teacher.notifyStudents();
}
}
总结
观察者模式是非常常用的一种设计模式,广泛存在于客户端开发和前端开发中,如手机屏幕点击事件的处理。