一、作用:
当一个对象发生变化时,其他对该对象有依赖关系的所有对象会收到通知,一起发生变化。这是一种一对多的关系。
二、代码示例:
注:我们的示例中,被观察的是MySubject类中的变量state。
需求是:当state的值改变时,观察者(ObserverA、ObserverB)中的ObjectState随之一起发生改变。
被观察者
/**
* 被观察者类需要实现的接口
*/
public interface Subject {
//添加观察者
public void add(Observer e);
//删除观察者
public void del(Observer e);
//通知所有观察者
public void notifyAllObserver(String newState);
}
/**
* 被观察者抽象类,所有需要被观察的类都要继承该抽象类
*/
public class AbstractSubject implements Subject{
List<Observer> list = new ArrayList<>();
public void add(Observer e) {
list.add(e);
}
public void del(Observer e) {
list.remove(e);
}
public void notifyAllObserver(String newState) {
//告知所有观察者:被观察者已经发生更新,请一同更新
for(Observer obs : list) {
obs.update(newState);
}
}
}
package observer;
/**
* 被观察的类
*/
public class MySubject extends AbstractSubject{
//被观察的变量,如果该值变化,观察者中的值也相应的发生变化
private String state = "未更新!";
public String getState() {
return state;
}
public void changeState(String newState) {
this.state = newState;
notifyAllObserver(newState);
}
}
观察者
/**
* 观察者接口,所有的观察者都要实现该接口
*/
public interface Observer {
//更新观察者状态
public void update(String newState);
}
/**
* 具体的观察者A
*/
public class ObserverA implements Observer{
//该变量随被观察者中被观察变量的变化而变化
private String observerState = "未更新!";
public void update(String newState) {
//更新观察者状态,使他与被观察者状态保持一致
this.observerState = newState;
}
}
/**
* 具体的观察者B
*/
public class ObserverB implements Observer{
////该变量随被观察者中被观察变量的变化而变化
private String observerState = "未更新!";
public void update(String newState) {
//更新观察者状态,使他与被观察者状态保持一致
this.observerState = newState;
}
}
测试类
public class Test {
public static void main(String[] args) {
MySubject sub = new MySubject();
ObserverA obA = new ObserverA();
ObserverB obB = new ObserverB();
System.out.println("被观察者" + sub.getState());
System.out.println("观察者" + sub.getState());
System.out.println("观察者" + sub.getState());
sub.changeState("已更新!");
System.out.println("被观察者" + sub.getState());
System.out.println("观察者" + sub.getState());
System.out.println("观察者" + sub.getState());
}
}