定义:
定义了对象之间一对多的依赖关系,当一个对象状态发生改变,其他的依赖于它的对象都能得到通知被被自动更新
结构:
指导思想:
主题维护所有的观察者,抽象观察者
解决的问题:
对象之间一对多的关系,一个对象的状态发生改变,依赖它的对象都将得到通知
实现方式:
在主题里维护一个观察者的列表,将观察者抽象出来,主题只需要知道对象是个观察者就行,就能调用更新方法
举例:
对于上课的场景,老师就是一种主题,学生就是观察者,当老师说要提问了,学生就接收到通知。
/**
* 观察者接口
*
* @author trevor.zhao
* @date 2021/5/21
*/
public interface Observer {
void update(Boolean asking);
}
/*******************************/
/**
* 好学生,是一个观察者
*/
public class GoodStudent implements Observer {
private Teacher teacher;
private String action;
//构造的时候传入主题,注册为观察者
public GoodStudent(Teacher teacher) {
this.teacher = teacher;
this.action = "好好听讲";
teacher.registerObserver(this);
}
//被主题通知的时候调用
@Override
public void update(Boolean asking) {
System.out.printf("我是好学生:");
if (asking) {
action = "老师提问了,准备举手回答";
System.out.println(action);
} else {
action = "好好听讲";
System.out.println(action);
}
}
}
public class BadStudent implements Observer {
private Teacher teacher;
private String action;
public BadStudent(Teacher teacher) {
this.teacher = teacher;
this.action = "偷偷玩手机";
teacher.registerObserver(this);
}
@Override
public void update(Boolean asking) {
System.out.printf("我是坏学生:");
if (asking) {
action = "躲躲闪闪,不要有眼神接触";
System.out.println(action);
} else {
action = "接着玩手机";
System.out.println(action);
}
}
}
/*********************************************/
/**
* 老师,这里是一个主题
*
* @author trevor.zhao
* @date 2021/5/21
*/
public class Teacher {
private Boolean asking;
private List<Observer> observerList;
public Teacher() {
this.asking = false;
this.observerList = new ArrayList<>();
}
//注册观察者
public void registerObserver(Observer observer) {
observerList.add(observer);
}
//取消注册观察者
public void unregisterObserver(Observer observer) {
int index = observerList.indexOf(observer);
if (-1 != index) {
observerList.remove(observer);
}
}
//通知观察者
public void notifyObservers(){
for (Observer o : observerList) {
o.update(asking);
}
}
//修改状态触发通知
public void setAsking(Boolean asking) {
this.asking = asking;
notifyObservers();
}
}