观察者模式

一、观察者模式简介

  观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。

  观察者模式的组成:

  • 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
  • 抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
  • 具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
  • 具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现

  观察者模式的UML图如下:

 观察者模式

二、观察者模式实现

  1、创建Watched接口(抽象主题角色)

观察者模式
 1 package com.test.observer;
 2 
 3 /**
 4  * 抽象主题角色
 5  */
 6 public interface Watched {
 7     public void addWatcher(Watcher watcher);
 8 
 9     public void removeWatcher(Watcher watcher);
10 
11     public void notifyWatchers(String str);
12 }
观察者模式

  2、创建Watcher接口(抽象观察者角色)

观察者模式
1 package com.test.observer;
2 
3 /**
4  * 抽象观察者角色
5  */
6 public interface Watcher {
7     public void update(String str);
8 }
观察者模式

  3、创建ConcreteWatched类(具体主题角色)

观察者模式
 1 package com.test.observer;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 /**
 7  * 具体主题角色
 8  */
 9 public class ConcreteWatched implements Watched {
10     // 用来保存观察者
11     private List<Watcher> list = new ArrayList<Watcher>();
12 
13     // 添加观察者
14     public void addWatcher(Watcher watcher) {
15         list.add(watcher);
16     }
17 
18     // 删除观察者
19     public void removeWatcher(Watcher watcher) {
20         list.remove(watcher);
21     }
22 
23     // 通知所有观察者
24     public void notifyWatchers(String str) {
25         for (Watcher watcher : list) {
26             watcher.update(str);
27         }
28     }
29 
30 }
观察者模式

  4、创建ConcreteWatcher类(具体观察角色)

观察者模式
package com.test.observer;

/**
 * 具体观察者角色
 */
public class ConcreteWatcher implements Watcher {
    public void update(String str) {
        System.out.println(str);
    }

}
观察者模式

  5、调用类

观察者模式
 1 package com.test.observer;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Watched girl = new ConcreteWatched();
 6 
 7         Watcher watcher1 = new ConcreteWatcher();
 8         Watcher watcher2 = new ConcreteWatcher();
 9         Watcher watcher3 = new ConcreteWatcher();
10 
11         girl.addWatcher(watcher1);
12         girl.addWatcher(watcher2);
13         girl.addWatcher(watcher3);
14 
15         girl.notifyWatchers("开心,爽");
16 
17         girl.removeWatcher(watcher2);
18 
19         girl.notifyWatchers("不爽");
20 
21     }
22 }
观察者模式

  运行结果如下图所示:

观察者模式

观察者模式

上一篇:⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈


下一篇:DEV控件校验常用方式