* 观察者模式:主要用于1:N的通知。
* 当一个对象(目标对象)的状态变化时,需要及时告知一系列对象(观察者对象),令他们做出响应。
* 就比如网上聊天,你发一条消息,其他人那里收到相同的消息内容。
*方式:
* 1.推:每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收。
* 2.拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。
下面写的是第一种方式:
public interface Observer {
void update(Subject subject);
}
public class Subject {
protected List<Observer> list = new ArrayList<Observer>();
public void registerObserver(Observer obs){
list.add(obs);
}
public void removeObserver(Observer obs){
list.remove(obs);
}
//通知观察者更新状态
public void notifyAllObservers(){
for(Observer obs:list){
obs.update(this);
}
}
}
/**
* 观察者
*/
public class ObserverA implements Observer{
private int myState;//myState需要和目标对象的state保持一致
@Override
public void update(Subject subject) {
myState = ((ConcreteSubject)subject).getState();
}
public int getMyState() {
return myState;
}
public void setMyState(int myState) {
this.myState = myState;
}
}
/**
* 目标对象
*/
public class ConcreteSubject extends Subject{
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
//调用父类的notifyAllObservers方法,更新观察者状态
this.notifyAllObservers();
}
}
调用:
//目标对象
ConcreteSubject subject = new ConcreteSubject();
//多个观察者
ObserverA ob1 = new ObserverA();
ObserverA ob2 = new ObserverA();
ObserverA ob3 = new ObserverA();
//将观察者加入到目标对象的观察队列中
subject.registerObserver(ob1);
subject.registerObserver(ob2);
subject.registerObserver(ob3);
//修改目标对象
subject.setState(10);
//查看观察者是否也变化
System.out.println(ob1.getMyState());
System.out.println(ob2.getMyState());
System.out.println(ob3.getMyState());
结果:
10
10
10