合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 观察者模式 Observer Pattern,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。 &nbsp; ## 组成 1. 抽象主题(Subject):抽象目标类,包含了一组观察者对象及对观察者管理、通知的方法。 2. 具体主题:具体目标类,实现抽象目标类的通知方法,当具体主题的内部状态发生改变时,通过所有注册过的观察者对象。 3. 抽象观察者(Observer):抽象类或者接口,包含一个更新自己的抽象方法,当收到具体主题的更改通知时被调用。 4. 具体观察者:实现抽象观察者中定义的抽象方法,以便在具体目标类更改时及时更新自身内容。 :-: ![](https://img.kancloud.cn/88/cb/88cbe0acc068359ffa442d4304a25b6b_590x462.png) 【图片来源:http://c.biancheng.net/view/1390.html】 实现举例: ~~~ package net.biancheng.c.observer; import java.util.*; public class ObserverPattern { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer obs1 = new ConcreteObserver1(); Observer obs2 = new ConcreteObserver2(); subject.add(obs1); subject.add(obs2); subject.notifyObserver(); } } //抽象目标 abstract class Subject { protected List<Observer> observers = new ArrayList<Observer>(); //增加观察者方法 public void add(Observer observer) { observers.add(observer); } //删除观察者方法 public void remove(Observer observer) { observers.remove(observer); } public abstract void notifyObserver(); //通知观察者方法 } //具体目标 class ConcreteSubject extends Subject { public void notifyObserver() { System.out.println("具体目标发生改变..."); System.out.println("--------------"); for (Object obs : observers) { ((Observer) obs).response(); } } } //抽象观察者 interface Observer { void response(); //反应 } //具体观察者1 class ConcreteObserver1 implements Observer { public void response() { System.out.println("具体观察者1作出反应!"); } } //具体观察者1 class ConcreteObserver2 implements Observer { public void response() { System.out.println("具体观察者2作出反应!"); } } ~~~ &nbsp; 注意事项: 1. 避免循环依赖 2. 避免顺序执行时,某一观察者错误导致系统卡顿,一般采用异步的方式。 &nbsp; JDK使用: 1. java.util.Observable和java.util.Observer接口定义了观察者模式。