关键词:
文章目录
观察者模式
概念
观察者模式(Observer Pattern)也称发布订阅模式,它的目的是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
观察者模式的类图如下图所:
观察者模式具有以下4个角色:
角色 | 说明 |
---|---|
抽象主题(Subject)角色 | 该角色又称为“被观察者”,可以增加和删除观察者对象。 |
抽象观察者(Observer)角色 | 该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。 |
具体主题(Concrete Subject)角色 | 该角色又称为“具体被观察者”,它将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。 |
具体观察者(Concrete Observer)角色 | 该角色实现抽象观察者所要求的更新接口,以便使自身的状态与主题的状态相协调。 |
代码案例:
定义抽象主题(Subject)角色类
package com.shixun.design.observer;
/**
* 抽象主题:被观察者
*/
interface Subject
// 登记一个新的观察者
public void attach(Observer obs);
// 删除一个登记过的观察者
public void detach(Observer obs);
// 通知所有登记过的观察者对象
public void notifyObserver();
定义抽象观察者(Observer)角色类
package com.shixun.design.observer;
/**
* 抽象观察者:为所有的具体观察者定义一个接口
*/
interface Observer
// 更新方法
public void update();
定义具体主题(Concrete Subject)角色类
package com.shixun.design.observer;
import java.util.Enumeration;
import java.util.Vector;
/**
* 具体主题:具体被观察者
*/
class ConcreteSubject implements Subject
private Vector<Observer> obsVector = new Vector<Observer>();
// 登记一个新的观察者
public void attach(Observer obs)
obsVector.add(obs);
// 删除一个登记过的观察者
public void detach(Observer obs)
obsVector.remove(obs);
// 通知所有登记过的观察者对象
public void notifyObserver()
for (Observer e : obsVector)
e.update();
// 返回观察者集合的Enumeration对象
public Enumeration<Observer> observers()
return obsVector.elements();
// 业务方法,改变状态
public void change()
this.notifyObserver();
定义具体观察者(Concrete Observer)角色类
package com.shixun.design.observer;
/**
* 具体观察者:实现抽象观察者所要求的更新接口
*/
class ConcreteObserver implements Observer
// 实现更新方法
public void update()
System.out.println(this+"收到通知,并进行处理!");
定义测试类:
package com.shixun.design.observer;
import com.shixun.design.strategy.ConcreteStrategy;
import com.shixun.design.strategy.Context;
public class Test
public static void main(String[] args)
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver();
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();
subject.attach(observer);
subject.attach(observer1);
subject.attach(observer2);
subject.change();
运行结果如下:
优缺点
优点
观察者模式具有以下几个优点:
-
观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是一个具体观察者集合,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体的观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密的耦合在一起,因此它们可以属于不同的抽象化层次,且都非常容易扩展。
-
支持广播通信。被观察者会向所有登记过的观察者发出通知,这就是一个触发机制,形成一个触发链。
缺点
观察模式的缺点如下:
- 如果一个主题有多个直接或间接的观察者,则通知所有的观察者会花费很多时间,且开发和调试都比较复杂。
- 如果在主题之间有循环依赖,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式时要特别注意这一点。
- 如果对观察者的通知是通过另外的线程进行异步投递,系统必须保证投递的顺序执行。
- 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有提供相应的机制使观察者知道所观察的对象是如何发生变化。
应用场景
观察者模式的应用场景如下:
- 关联行为场景。
- 事件多级触发场景。
- 跨系统的消息交换场景,如消息队列的处理机制。
java单例模式之总有你想不到的知识(代码片段)
文章目录Java单例模式概念满足条件两种形式设计要求饿汉模式懒汉方式懒汉式多线程解决方案synchronized双检查锁方式静态内部类枚举(别瞎用)Java单例模式概念单例模式是Java中最简单的设计模式之一。这种类型的设计... 查看详情
java责任链模式之总有你想不到的知识(代码片段)
文章目录责任链模式概念代码案例:优缺点优点缺点应用场景应用案例:多级处理责任链模式概念责任链模式(ChainofResponsibilityPattern)是一种常见的行为模式,它的目的是使多个对象都有机会处理请求,... 查看详情
java单例模式之总有你想不到的知识
文章目录Java单例模式单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式单例模式确保在一个应用程序中某一个类只有一个实例,而且自行实例化并向整个系统提供... 查看详情
java工厂模式之总有你想不到的知识(代码片段)
文章目录Java工厂模式概念三种工厂模式简单工厂模式代码示例工厂方法模式代码示例抽象工厂模式工厂模式优缺点优点:缺点:Java工厂模式概念工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程... 查看详情
java抽象工厂模式之总有你想不到的知识(代码片段)
文章目录抽象工厂概念优缺点优点缺点适用场景代码案例抽象工厂使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。... 查看详情
深入jdk源码,这里总有你不知道的知识点!
Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础。我们下面将总结和分析一下lang包下面最为基础和常用的几个部分。1:常用... 查看详情
java设计模式之观察者模式(代码片段)
1、初步认识观察者模式的定义: 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。大白话: 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了... 查看详情
166个最常用的linux命令汇总,总有你需要用到的!(代码片段)
我是二黑,一个快要秃头的测试人欢迎点赞收藏⭐留言如有错误敬请指正!我收集了一些软件测试资料,关注我公众号:程序员二黑,免费领取!最困难的时候,也就是我们离成功不远的时候!文... 查看详情
十家大厂,两百多道android面试题,总有你需要的(代码片段)
直接上正题:京东,字节跳动,美团,哔哩哔哩,声网,掌门教育,传音控股,得物,哈啰出行,小红书,其他厂经典题。前言前段时间在看机会,本文就是我对求职过程的一个总结... 查看详情
基础知识1.设计模式是什么?你知道哪些设计模式,请简要叙述?(代码片段)
...声明全局变量。在整个进程运行期间只会被赋值一次。4).观察者模式:KVO是典型的观察者模式,观察某个属性的状 查看详情
设计模式系列--观察者模式(代码片段)
...设计模式的相关知识,今天小编向大家介绍的模式是观察者模式,还请小伙伴多多指教,小编会从什么是原型观察者模式、观察者模式的结构图、观察者模式的demo以及观察者模式的特点和应用场景等方面一一 查看详情
java实现观察者(发布-订阅)模式(代码片段)
观察者模式(Observer),也叫发布-订阅模式(Publish-Subscribe)观察者模式涉及到被观察的主题(Subject)与观察者(Observer)2个角色,主题发布消息,观察者响应消息。观察者可以订阅主题,也可以取消订阅。观察者模式示例:主播与粉丝主题... 查看详情
观察者模式深度剖析(代码片段)
...生,在外面看来像是实现了自动执行的感觉。这就引入了观察者模式,观察者模式在Java中的地位是及其重要的。在讲观察者模式之前,我们要有这样 查看详情
java观察者模式(代码片段)
设计模式3-观察者模式observerpattern(代码片段)
观察者模式:在对象之间定义了一对多的依赖,当一个对象改变状态,依赖它的对象会收到通知并自动更新。其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。观察者模式... 查看详情
springioc源码深入剖析预备知识(代码片段)
...之工厂4.1.1简单工厂模式4.2设计模式之模板4.3设计模式之观察者5AOP用到的那些设计模式5 查看详情
java设计模式之观察者学习与掌握(代码片段)
...、模型-视图模式,它是对象行为型模式。优点目标与观察者之间建立了一套触发机制。降低了目标与观察者之间的耦合关系,两者之间是抽象耦 查看详情
java设计模式之观察者学习与掌握(代码片段)
...、模型-视图模式,它是对象行为型模式。优点目标与观察者之间建立了一套触发机制。降低了目标与观察者之间的耦合关系,两者之间是抽象耦 查看详情