定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
类图
具体代码实现
需求:有一个进度生成器, 用来模拟进度条的数值. 当进度数值更新后, 就会通知进度栏更新值. 也就是进度栏是观察者, 随时间在变的进度值是主题内容。
Observer接口
//观察者接口,观察者统一定义
public interface Observer {
/**
* 观察者会被数值生成器通知,来更新自己的状态。
* @param 被观察的进度条类
*/
void update(ProgressBar generator);
}
DigitObserver类
//数字进度类. 这是其中一种观察者的实现, 也是一种具体的进度条.
public class DigitObserve implements Observer {
/**
* Observer(观察者)会被数值生成器通知, 来更新自己的状态。
* @param 被观察的进度条类
*/
@Override
public void update(ProgressBar generator) {
System.out.println("数字版进度条:" + generator.getNumber() + "%");
}
}
GraphObserver类
//图形进度条类, 这是其中一种观察者的实现, 也是一种具体的进度条.
public class graphObserver implements Observer {
public void update (ProgressBar generator) {
System.out.println("图形版进度条:" + generator.getNumber() + "%");
}
}
ProgressBar类
// 生成数值的类, 同时会保存观察者们, 当数值生成的时候就会去通知所有观察者们
public class ProgressBar {
//保存观察者们的集合
private List<Observer> observerList = new ArrayList();
//当前进度条的数值
private int number;
/**
* 当前进度条的数值
* @param 返回当前进度条的数值
*/
public int getNumber() {
return number;
}
/**
* 生成数值并通知观察者们更新
*/
public void execute() {
for (int i = 0; i <= 100; i += 10) {
number = i;
notifyObservers();
}
}
/**
* 添加观察者到进度条
* @param 被添加的观察者
*/
public void addObserver(Observer observer) {
observerList.add(observer);
}
/**
* 向observer发送通知
*/
public void notifyObservers() {
for (Observer o : Observers) {
o.update();
}
try {
System.out.println();
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}