一、基本介绍
观察者模式(行为型):指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,也叫订阅—发布模式。
二、包含角色
1.主题(监视)角色:提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,并在监视到变化时通知所有观察者的更新方法。
2.抽象观察者角色:定义了一个更新自己的方法的接口,当接到更改通知时被调用。
3.具体观察者:实现抽象观察者中定义的方法,以便在得到目标的更改通知进行自己的具体更新操作。
三、案例及UML类图
案例说明:
每个学期都会有一次卫生检查,当收到领导来检查的消息时,老师们开始指挥学生们搞卫生,学生们进行卫生操作。
UML类图:
类ClassPerson:
public interface ClassPerson {
void updata();
}
说明:班级人员接口,抽象观察者角色,定义了一个更新操作的方法。
类Student:
public class Student implements ClassPerson {
@Override
public void updata() {
System.out.println("学生开始做卫生!");
}
}
说明:学生类,具体观察者角色,实现更新方法,学生接到通知后开始做卫生。
类Teacher:
public class Teacher implements ClassPerson {
@Override
public void updata() {
System.out.println("老师指挥学生做卫生!");
}
}
说明:老师类,具体观察者角色,实现更新方法,老师接到通知后指挥学生们做卫生。
类Monitor:
public class Monitor {
private List<ClassPerson> classPersonList = new ArrayList<>();
/**
* 添加需要通知的对象
* @param classPerson 学校管理类
*/
public void addObserver(ClassPerson classPerson) {
classPersonList.add(classPerson);
}
/**
* 通知所有观察者
*/
public void notifyAllObservers() {
for(ClassPerson classPerson : classPersonList) {
classPerson.updata();
}
}
}
说明:监视类,主题(监视)角色,添加观察者,当通知到达后调用唤醒观察者的方法,让观察者自己进行更新操作。
类ObserverTest:
public class ObserverTest {
public static void main(String[] args) {
Monitor monitor = new Monitor();
//添加老师作为通知对象
ClassPerson teacher = new Teacher();
monitor.addObserver(teacher);
//添加学生作为通知对象
ClassPerson student = new Student();
monitor.addObserver(student);
System.out.println("检查人员来了!");
//进行通知
monitor.notifyAllObservers();
}
}
说明:测试及客户端。
四、适用场景
1.对象间存在一对多关系,且一个对象的状态发生改变会影响其他对象。
2.一个对象必须通知其他对象,而并不知道这些对象具体是谁。