观察者模式又叫做发布-订阅模式。
定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。
Subject:主题或抽象通知者。把所有对观察者对象的引用保存在一个聚合里面。
public abstract class Subject { private List<Observer> observers = new ArrayList<>(); //增加观察者 public void attach(Observer observer){ observers.add(observer); } //移除观察者 public void detach(Observer observer){ observers.remove(observer); } //通知 public void notifyData(){ for (Observer ob:observers) { ob.update(); } } }
Observer,抽象观察者,在得到主题的通知时更新自己。
public abstract class Observer { public abstract void update(); }
ConcreteSubject,具体主题或具体通知者,将有关状态存入。具体主题的内部状态变化,给所有观察者发出通知
public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
ConcreteObserver,具体观察者,使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。
public class ConcreteObserver extends Observer { private String name; private String observerState; private ConcreteSubject subject; public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } @Override public void update() { observerState = subject.getSubjectState(); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
Main:
public class Main { public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject(); concreteSubject.attach(new ConcreteObserver("x",concreteSubject)); concreteSubject.attach(new ConcreteObserver("y",concreteSubject)); concreteSubject.attach(new ConcreteObserver("z",concreteSubject)); concreteSubject.setSubjectState("abc"); concreteSubject.notifyData(); } }
使用场景:当一个对象的改变需要同时改变其他对象的时候。