当一个对象的状态改变时,它需要通知一系列对象(观察者),令它们做出响应。这就是观察者模式。常用场景:网络游戏,服务器将客户端的状态进行分发。
观察者接口,包含一个update方法。
public interface Observer {
void update(Subject subject);
}
目标对象类
public class Subject {
//存储所有观察者对象引用
protected List<Observer> list = new ArrayList<>();
public void registObserver(Observer observer){
list.add(observer);
}
public void removeObserver(Observer observer){
list.remove(observer);
}
//通知所有的观察者更新状态
public void notifyObserver(){
for(Observer observer: list){
observer.update(this);
}
}
}
具体目标对象类
public class ConcreteSubject extends Subject{
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
this.notifyObserver();
}
}
具体观察者类
public class ObserverClient implements Observer {
private int myState;
@Override
public void update(Subject subject) {
this.myState = ((ConcreteSubject)subject).getState();
}
public int getMyState() {
return myState;
}
public void setMyState(int myState) {
this.myState = myState;
}
}
测试类
public class Test {
public static void main(String[] args) {
//目标对象
ConcreteSubject concreteSubject = new ConcreteSubject();
ObserverClient observer = new ObserverClient();
ObserverClient observer1 = new ObserverClient();
concreteSubject.registObserver(observer);
concreteSubject.registObserver(observer1);
concreteSubject.setState(1);
concreteSubject.notifyObserver();
System.out.println(observer.getMyState());
System.out.println(observer1.getMyState());
}
}
最后的输出结果:
1
1