观察者模式又称为订阅/发布模式
该模式定义了对象之间的一对多的依赖关系,这样,当“一”的一方状态发生变化时,它所依赖的多方都会受到通知并自动更新
举例:一个老师对应多个学生,老师发布作业,学生接收作业。
public interface Observer {
//当主题改变时,会将一个String类型字符串传入该方法,每个观察者都需要实现该方法
public void update(String info);
}
public interface Subject {
//添加观察者
void addObserver(Observer obj);
//移除观察者
void deleteObserver(Observer obj);
//当方法主题改变时,这个方法被调用,通知所有的观察者
void notifyObserver();
}
public class StudentObserver implements Observer {
//保存一个Subject的引用,便于取消订阅
private TeacherSubject t;
//学生姓名
private String name;
//构造器,用于注册观察者
public StudentObserver(String name, TeacherSubject t) {
this.name = name;
this.t = t;
t.addObserver(this);
}
public TeacherSubject getT() {
return t;
}
@Override
public void update(String info) {
System.out.println(name+"得到作业"+info);
}
}
import java.util.ArrayList;
import java.util.List;
public class TeacherSubject implements Subject {
//用来存放和记录观察者
private List<Observer> observers = new ArrayList<Observer>();
//记录状态的字符串
private String info;
@Override
public void addObserver(Observer obj) {
observers.add(obj);
}
@Override
public void deleteObserver(Observer obj) {
observers.remove(obj);
}
@Override
public void notifyObserver() {
for(Observer observer:observers){
observer.update(info);
}
}
//布置作业的方法,在方法最后,调用notifyObserver()方法,通知所有的观察者更新状态
public void setHomework(String info){
this.info=info;
System.out.println("今天的作业是"+info);
this.notifyObserver();
}
}
public class TestObserver {
public static void main(String[] args) {
TeacherSubject teacherSubject = new TeacherSubject();
StudentObserver xiaoming = new StudentObserver("xiaoming",teacherSubject);
StudentObserver xiaohong = new StudentObserver("xiaohong",teacherSubject);
teacherSubject.setHomework("第一章第一题");
xiaohong.getT().deleteObserver(xiaohong);
teacherSubject.setHomework("第一章第二题");
}
}
输出结果:
image.png
网友评论