定义:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。
类图
- Subject:所有具体主题的公共接口,包含注册观察者(订阅),移除观察者(取消订阅),通知观察者(消息更新)
- ConcreteSubject:具体的主题,可以通过setState设置状态变化调用notifyObservers通知观察者
- Observer:观察者接口,所有观察者都要实现,只有一个update()方法
- ConcreteObserver:具体的观察者
代码示例
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }public class LogitechSupplier implements Subject { Vector<Observer> observers; String message; public LogitechSupplier(){ observers = new Vector<>(); } @Override public void registerObserver(Observer observer) { observers.addElement(observer); } @Override public void removeObserver(Observer observer) { observers.removeElement(observer); } @Override public void notifyObservers() { for(Observer observer:observers){ observer.update(message); } } public void messageChanged(String message){ this.message=message; notifyObservers(); } } public interface Observer { void update(Object args); } public class TBShop implements Observer { Subject subject; public TBShop(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(Object args) { System.out.println("天猫商城收到消息:"+args); } } public class JDShop implements Observer { Subject subject;//通过持有主题,可以从主题拉取数据 public JDShop(Subject subject){ this.subject=subject; subject.registerObserver(this); } @Override public void update(Object args) { System.out.println("京东商城收到消息:"+args); } }
测试
public class ObserverPatternTestDemo { public static void main(String args[]){ //获取主题 LogitechSupplier logitechSupplier = new LogitechSupplier(); //观察者注册 Observer jdShop = new JDShop(logitechSupplier); Observer tbShop = new TBShop(logitechSupplier); //主题向观察者推送消息 logitechSupplier.messageChanged("新鼠标到货了!"); logitechSupplier.messageChanged("机械键盘降价10%"); } }