设计模式-观察者模式

164 阅读2分钟

一、模式定义

定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并更新;

模式的优点:
1)满足开闭原则;
2)可以在运行时建立对象之间的关系;

二、示例代码

  1 /**
  2  * 类描述:  观察者模式
  3  *
  4  * @author XXSD
  5  * @version 1.0.0
  6  * @date 2020/2/4 0004 下午 4:24
  7  */
  8 public class ObserverTest {
  9     public static void main(String[] values) {
 10         final Suject<Object> objectSuject = new Suject<>();
 11         objectSuject.addObserver(new ObserverTask1());
 12         objectSuject.addObserver(new ObserverTask2());
 13         objectSuject.alter(123);
 14     }
 15 }
 16 
 17 /**
 18  * 类描述: 主题对象
 19  * 主题对象其实就是一个容器,包含添加、删除观察者等方法;
 20  *
 21  * @author : XXSD
 22  * @date : 2020/2/4 0004 下午 4:26
 23  */
 24 class Suject<T> {
 25 
 26     /**
 27      * 属性描述:定义一个观察者容器
 28      *
 29      * @date : 2020/2/4 0004 下午 4:31
 30      */
 31     List<Observer<T>> observerList = new ArrayList<>(16);
 32 
 33     /**
 34      * 功能描述:添加观察者
 35      *
 36      * @author : XXSD
 37      * @date : 2020/2/4 0004 下午 4:32
 38      */
 39     public void addObserver(Observer<T> observer) {
 40         observerList.add(observer);
 41     }
 42 
 43     /**
 44      * 功能描述:移除观察者
 45      *
 46      * @author : XXSD
 47      * @date : 2020/2/4 0004 下午 4:33
 48      */
 49     public void removeObserver(Observer<T> observer) {
 50         observerList.remove(observer);
 51     }
 52 
 53     /**
 54      * 功能描述:修改被触发时通知所有观察者
 55      *
 56      * @author : XXSD
 57      * @date : 2020/2/4 0004 下午 4:37
 58      */
 59     public void alter(T value) {
 60         for (Observer<T> observer : observerList) {
 61             observer.updata(value);
 62         }
 63     }
 64 }
 65 
 66 /**
 67  * 类描述: 观察者接口
 68  *
 69  * @author : XXSD
 70  * @date : 2020/2/4 0004 下午 4:27
 71  */
 72 interface Observer<T> {
 73     /**
 74      * 功能描述:更新处理方法
 75      * @param object 需要处理的数据
 76      * @author : XXSD
 77      * @date : 2020/2/4 0004 下午 4:30
 78      */
 79     void updata(T object);
 80 }
 81 /**
 82 * 类描述: 观察者实现
 83 * @author : XXSD
 84 * @date : 2020/2/4 0004 下午 4:40
 85 */
 86 class ObserverTask1 implements Observer<Object> {
 87 
 88     /**
 89      * 功能描述:更新处理方法
 90      *
 91      * @param object 需要处理的数据
 92      * @author : XXSD
 93      * @date : 2020/2/4 0004 下午 4:30
 94      */
 95     @Override
 96     public void updata(Object object) {
 97         System.out.println(this.getClass().getSimpleName() + "执行方法");
 98     }
 99 }
100 /**
101 * 类描述: 观察者实现
102 * @author : XXSD
103 * @date : 2020/2/4 0004 下午 4:40
104 */
105 class ObserverTask2 implements Observer<Object> {
106 
107     /**
108      * 功能描述:更新处理方法
109      *
110      * @param object 需要处理的数据
111      * @author : XXSD
112      * @date : 2020/2/4 0004 下午 4:30
113      */
114     @Override
115     public void updata(Object object) {
116         System.out.println(this.getClass().getSimpleName() + "执行方法");
117     }
118 }

三、在Java中的经典应用

3.1)java.util.Observable

这个类就是一个观察者模式的经典应用;
1)“private Vector obs;”容器对象;
2)notifyObservers通知方法;

3.2)org.springframework.context.ApplicationListener

是Spring中事件监听器的接口,这里也是观察者模式的一个经典应用;