观察者模式
看一个类图:
这里我们订阅者可以称之为观察者,需要给订阅的报社称之为目标
核心:
-
观察模式主要用于 1:N的通知。当一个对象(目标对象Subject)的状态发生变化时,他需要及时告知一系列对象(观察者对象),令他们做出响应。
-
通知观察者的方式:
- 推:每次都会把通知以广播的形式发给所有观察者,所有观察者真能被动接收。
- 拉:观察只要知道有情况即可。至于什么时候获取内容,获取什么内容都自己决定
JAVASE提供了java.util.Obserable和java.util.Observer来实现观察者模式。
代码:
public interface Observer {
void update(Subject subject);
}
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers=new ArrayList<>();
//注册一个观察者
public void registerObserver(Observer obs){
observers.add(obs);
}
//删除一个观察者
public void removeObserver(Observer obs){
observers.remove(obs);
}
//通知所有观察者更新
public void notifaAllObservers(){
for (Observer observer : observers) {
observer.update(this);
}
}
}
public class ConcreteSuject extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
this.notifaAllObservers();
}
}
public class ObserverA implements Observer {
private int mystate;//mystate需要跟目标对象保持一致
@Override
public void update(Subject subject) {
mystate= ((ConcreteSuject)subject).getState();
}
public int getMystate() {
return mystate;
}
public void setMystate(int mystate) {
this.mystate = mystate;
}
}
public class Client {
public static void main(String[] args) {
//目标对象
ConcreteSuject concreteSuject=new ConcreteSuject();
//创建多个观察者对象
ObserverA obs1 = new ObserverA();
ObserverA obs2 = new ObserverA();
ObserverA obs3 = new ObserverA();
concreteSuject.registerObserver(obs1);
concreteSuject.registerObserver(obs2);
concreteSuject.registerObserver(obs3);
concreteSuject.setState(2000);
System.out.println("==============");
System.out.println(obs1.getMystate());
System.out.println(obs2.getMystate());
System.out.println(obs3.getMystate());
concreteSuject.setState(2);
System.out.println("==============");
System.out.println(obs1.getMystate());
System.out.println(obs2.getMystate());
System.out.println(obs3.getMystate());
}
}