观察者模式

简介: 一、观察者模式简介   观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

一、观察者模式简介

  观察者模式(有时又被称为发布-订阅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 }

  运行结果如下图所示:

 

目录
相关文章
|
1天前
观察者模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 观察者模式是一种对象行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中,存在两种类型的对象:目标对象和观察者对象。目标对象负责发出通知,而观察者对象则订阅目标对象,以便在目标对象的状态发生变化时接收到通知。一旦接收到通知,观察者对象就会执行相应的行为。 优缺点 观察者模式的优点主要包括: 解耦:观察者模式有助于降低目标对象和观察者对象
2 0
|
1月前
|
C++
【C++】—— 观察者模式
【C++】—— 观察者模式
|
1月前
|
设计模式 JavaScript 开发者
详细讲解什么是观察者模式
详细讲解什么是观察者模式
|
9月前
|
关系型数据库 API
观察者模式解读
观察者模式解读
|
4月前
|
设计模式 Java
【观察者模式】 ——每天一点小知识
【观察者模式】 ——每天一点小知识
|
6月前
5 # 观察者模式
5 # 观察者模式
15 0
|
10月前
|
设计模式 存储
设计模式-观察者模式(Observer)
设计模式-观察者模式(Observer)
69 0
|
11月前
|
设计模式
观察者模式(上)
观察者模式(上)
53 0
|
11月前
|
XML 设计模式 Java
观察者模式(下)
观察者模式(下)
41 0
|
设计模式
我学会了,观察者模式
观察者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
104 0
我学会了,观察者模式