Observer
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动刷新(发布-订阅)
目标(通知的发送者)--->观察者(n),可以有任意数目的观察者订阅并接受通知。
① 创建观察者(接收通知状态的接口)Observer
public interface Observer {
// 接收状态
abstract void DoProgress(int state);
}
② 创建观察者实现类
public class FirstObserver implements Observer {
@Override
public void DoProgress(int state) {
System.out.println("firstState:"+state);
}
}
public class SecondObserver implements Observer {
@Override
public void DoProgress(int state) {
System.out.println("secondState:"+state);
}
}
public class ThirdObserver implements Observer {
@Override
public void DoProgress(int state) {
System.out.println("thirdState:"+state);
}
}
③ 创建目标(发布通知者接口)
/**
* 被观察者接口
* 添加,删除,通知观察者
*/
public interface Subject {
void add(Observer observer);
void del(Observer observer);
void notifyObserver();
}
④ 目标实现类
/**
* 被观察者实现类
*/
public class ConcreteSubject implements Subject {
private int state; // 观察者状态
private List<Observer> list; // 观察者集合
public ConcreteSubject(){
list = new ArrayList<Observer>();
}
@Override
public void add(Observer observer) {
list.add(observer);
}
@Override
public void del(Observer observer) {
list.remove(observer);
}
// 通知观察者
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.DoProgress(state);
}
}
public void setState(int state){
// 状态更新
this.state = state;
// 通知所有观察者
notifyObserver();
}
}
⑤ 创建测试类
其中:Subject和Object接口稳定,而实现类变化大
Subject(目标):提供注册和删除观察者对象的接口
Observer(观察者):为那些在目标发生改变时须获得通知的对象定义一个更新接口(接收状态)
ConcreteSubject(具体目标):将有关状态存入各具体观察者对象,当它状态改变时,回调notify,发出通知
FirstObserver(具体观察者):存储于目标对象一致的状态state,实现Observer的更新接口使状态与具体目标一致