设计模式(7):观察者模式

203 阅读2分钟

观察者模式(发布-订阅模式)

定义

一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

主体为观察者和被观察者,被观察者出现变化则通知观察者,然后观察则则进行后续操作。注意,在这里强调被观察者只有一个,而观察者可以有多个,所以这是多对一的依赖关系。

示例和代码

以学校放假为例。每个班有一个班主任,一个班有很多学生,当假期来临,班主任会通知班里所有的学生相关放假事项,而学生收到放假的通知后就会收拾回家。这就是一种观察者模式。

//定义老师的接口。
//一个方法为通知所有学生要放假了;
//一个为给班里新来的学生登记一下,不然老师也记不住有哪些学生需要通知
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();
    }
}

总结

观察者模式是非常常用的一种设计模式,广泛存在于客户端开发和前端开发中,如手机屏幕点击事件的处理。