观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象再状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。我们来看一个老板来了,由秘书通知同事放下手头的事继续工作的小例子。
1、通知者类,包括添加观察者、删除观察者、通知以及通知的内容设置和获取。
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
public void notifyObserver();
public String getSubjectState();
public void setSubjectState(String action);
}
2、秘书类实现通知者类
public class Secretary implements Subject{
private List<Observer> observers = new ArrayList<Observer>();
private String action;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObserver() {
for(Observer observer:observers){
observer.update();
}
}
@Override
public String getSubjectState() {
return action;
}
@Override
public void setSubjectState(String action) {
this.action = action;
}
}
3、抽象观察者类包括姓名、监听主题和更新方法
public abstract class Observer {
protected String name;
protected Subject sub;
public Observer(String name,Subject sub){
this.name = name;
this.sub = sub;
}
public abstract void update();
}
4、同事类继承观察者类,可以是多个同事
public class StockObserver extends Observer{
public StockObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void update() {
System.out.println(sub.getSubjectState()+","+name+"关闭股票行情,继续工作!");
}
}
5、测试
public class Test {
public static void main(String[] args) {
// 实例化通知者
Secretary secretary = new Secretary();
// 实例化观察者
StockObserver tongshi = new StockObserver("小明",secretary);
// 添加观察者
secretary.attach(tongshi);
// 设置通知状态
secretary.setSubjectState("老板回来啦");
// 通知同事老板回来了
secretary.notifyObserver();
}
}