1、模式理解:一个对象,被多个对象进行观察,当这个对象发生改变时,会通知观察这个对象的对象。由此可见,被观察者类包含观察者类集合,当被观察者被改变时,有方法调用观察者的方法以此来通知观察者,观察者里有被观察者对象,同时当观察者被创建的时候要匹配对象的被观察者
2、运用场景:对于那种牵一发而动全身的事件可以用这种模式:
3、代码示例:来自:https://www.cnblogs.com/fingerboy/p/5468994.html
//先创建一个观察者接口
public interface Observer {
void update(String info);
}
//再写一个被观察者接口
public interface Subject {
void addObserver(Observer observer);
void deleteObserver(Observer observer);
void notifyObserver();//通知观察者
}
//创建具体的被观察者
public class Teacher implements Subject{
List<Observer> list=new ArrayList<>();
private String info;
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
if (list.size()>0) {
list.remove(observer);
}
}
@Override
public void notifyObserver() {
for (int i = 0; i < list.size(); i++) {
list.get(i).update(info);
}
}
public void setHomework(String info){
this.info=info;
System.out.println("今天的作业是"+info);
this.notifyObserver();
}
}
//创建具体的观察者
public class Student implements Observer{
Teacher teacher;
private String name;
public Student(String name,Teacher teacher) {
this.name=name;
this.teacher=teacher;
teacher.addObserver(this);
}
@Override
public void update(String info) {
System.out.println(name+"得到的作业是:"+info);
}
}
//最后写个测试类测试一下
public class Main {
public static void main(String[] args) {
Teacher teacher=new Teacher();
Student student1=new Student("tudou", teacher);
Student student2=new Student("xigua", teacher);
teacher.setHomework("三年模拟五年真题");
}
}