观察者模式
该模式下被观察者和观察者对象形成一对多的关系,当被观察者发生改变时,所有的观察者都会接收到通知。
1. 使用场景
当一个对象的改变需要通知给其他对象,而又不知道其他对象是谁、有多少。
2. 角色
- Subject 抽象主题,被观察者(Observable),使用集合存储所有抽象观察者,并提供增加删除观察者的方法。
- ConcreteSubject 具体主题,具体被观察者,实现了给具体观察者通知状态改变的逻辑。
- Observer 抽象观察者,定义了在得到通知后进行更新的接口方法。
- ConcreteObserver 具体观察者,实现了具体的更新逻辑。
3. 实践
// 抽象主题,此处使用java.util包中的Observable类作为抽象被观察者
// 该类使用Vector<Observer>存储被观察者,使用boolean changed 记录状态是否改变
// 具体被观察者
public class DevTechFrontier extends Observable {
public void postNewPublication(String content) {
// 标识状态或者内容发生改变,修改changed为true
setChanged();
// 通知所有观察者,遍历观察者集合,依次调用update方法,并将结果传入
notifyObservers(content);
}
}
// 抽象被观察者,使用java.util中的Observer接口,传入被观察者及返回结果。
// 具体观察者,实现Observer接口
public class Coder implements Observer {
public String name;
public Coder(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Hi, " + name + ", DevTechFrontier 跟新啦, 内容:" + arg);
}
@Override
public String toString() {
return "码农: " + name;
}
}
4. 总结
主要作用就是解耦,提高了系统的灵活性和可扩展性,