本文由 colodoo(纸伞)整理
参考书籍《图解设计模式》
QQ 425343603
Java学习交流群(717726984)
观察者模式
- Subject(观察对象)
- ConcreteSubject(具体的观察对象)
- Observer(观察者)
- ConcreteObserver(具体的观察者)
Subject(观察对象)
Subject角色表示观察对象。Subject对象定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在状态”的方法。
ConcreteSubject(具体的观察对象)
ConcreteSubject角色表示具体的被观察对象。当自身的状态发生改变,它会通知所有已经注册的Observer角色。
Observer(观察者)
Observer角色表示观察者。Observer角色负责接收来自Subject角色的状态变化通知。
ConcreteObserver(具体的观察者)
ConcreteObserver角色表示具体的Observer。当它的update方法被调用后,会去获取要观察的对象的最新状态。
类图
代码样例
观察者
/**
* 观察者接口
*
* @author colodoo(纸伞)
***/
public interface Observer {
public abstract void update(Subject subject);
}
具体观察者
/**
* 具体观察者
*
* @author colodoo(纸伞)
*/
public class ConcreteObserver implements Observer {
public void update(Subject subject) {
// 具体处理逻辑
// TODO
}
}
观察对象
/**
* 观察对象
*
* @author colodoo(纸伞)
**/
public abstract class Subject {
// 观察者列表
private ArrayList<Observer> observers = new ArrayList<Observer>();
// 新增观察者
public void addObserver(Observer observer) {
this.observers.add(observer);
}
// 删除观察者
public void deleteObserver(Observer observer) {
this.observers.remove(observer);
}
// 通知观察者
public void notifyObservers() {
Iterator it = observers.itrator();
while(it.hasNext()) {
Observer o = (Observer) it.next();
o.update(this);
}
}
// 获取状态
public abstract int getStatus();
// 执行
public abstract void execute();
}
具体观察对象
/**
* 具体观察对象
*
* @author colodoo(纸伞)
*/
class class ContreteSubject extends Subject {
// 状态
private int status = 0;
// 获取状态
public int getStatus() {
return this.status;
}
// 执行
public void execute() {
// 处理逻辑
// TODO
// 通知观察者
this.notifyObservers();
}
}