首先来解释下观察者模式:
在上图中改变属性的对象称为主体(subject),观察改变的对象称为观察器(observer)。Observer类有一个简单的接口,它包含一个update方法,当属性发生改变时,这个方法由主体调用,为观察器提供了一个刷新机会。主体有一组Observer对象,它们记录变化中一个方面——使用addObserver方法进行记录,如果需要可以使用removeObserver方法取消记录。主体还有一个受保护的notify方法,它在观察器上迭代,调用每个观察器上的update方法。
例子:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreateSubject subject = new ConcreateSubject();
ConcreateObserver observer = new ConcreateObserver();
observer.setSubject(subject);
subject.setValue(8);
}
}
// 主体
abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
protected void notifyObserver() {
System.out.println("通知观察器");
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update();
}
}
}
// 观察器
interface Observer {
public void update();
}
// 实现subject的类
class ConcreateSubject extends Subject {
private int value;
public void setValue(int value) {
this.value = value;
notifyObserver();
}
public int getValue() {
return value;
}
// 可以实现自己的通知方式
protected void notifyObserver() {
super.notifyObserver();
}
}
// 实现ObServer的类
class ConcreateObserver implements Observer {
private ConcreateSubject subject;
public ConcreateSubject getSubject() {
return subject;
}
public void setSubject(ConcreateSubject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("主体改变了 新值为:" + subject.getValue() + ",接下来进行更新操作...");
}
}