笨蛋学设计模式行为型模式-观察者模式【14】

2024-01-20 07:36

本文主要是介绍笨蛋学设计模式行为型模式-观察者模式【14】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

行为型模式-观察者模式

    • 8.1观察者模式:arrow_up::arrow_up::arrow_up:
      • 8.1.1概念
      • 8.1.2场景
      • 8.1.3优势 / 劣势
      • 8.1.4观察者模式可分为
        • 观察者的基本结构:
      • 8.1.5观察者模式
      • 8.1.6实战
        • 8.1.6.1题目描述
        • 8.1.6.2输入描述
        • 8.1.6.3输出描述
        • 8.1.6.4代码
      • 8.1.7总结

8.1观察者模式⬆️⬆️⬆️

8.1.1概念

​ 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,会通知所有依赖它的观察者对象,使它们都能够得到通知并且被自动更新

8.1.2场景

​ 在我们生活中,用户可以在音乐播放平台关注多个歌手,而当有歌手发布新的歌曲时,可以将歌曲发布到音乐播放平台,而平台会将新的歌曲详细信息发送给关注该歌手的用户。而此时歌手就相当于是观察者模式的主题对象,每个关注的用户则是观察者模式中的观察者对象,通过该模式,用户可以很及时的听到歌手的新歌曲,而歌手也可以很轻松的通知用户新歌曲的发布。

8.1.3优势 / 劣势

  • 灵活性:提供了灵活的观察者注册机制,可以随时添加或删除观察者,使得系统更加灵活和可扩展
  • 自动更新:当被观察者的状态发生改变时,所有依赖它的观察者都会自动收到通知并更新,提高了系统的自动化程度

  • 性能影响:当被观察者的状态发生改变时,所有观察者都会收到通知并且进行相应的通知,可能导致大量的通知和计算,影响系统性能
  • 通知竞态条件:若多个线程同时修改被观察者的状态,可能会产生竞态条件,导致某些观察者未能及时收到通知或收到错误的通知

8.1.4观察者模式可分为

  • 主题Subject:就是被观察的对象,可以维护一组观察者,当主题本身发生改变时就会通知观察者
  • 观察者Observer:观察主题的对象,当"被观察"的主题发生变化时,观察者就会得到通知并执行相应的处理

观察者的基本结构:
  • 主题Subject:一般会定义成一个接口,提供方法用于注册、删除、通知观察者,通常也包含一个状态,当状态发生改变时,通知所有的观察者
  • 观察者Observer:观察者也需要实现一个接口,包含一个更新方法,在接收主题通知时执行对应的操作
  • 具体主题ConcreteSubject:主题的具体实现,维护一个观察者列表,包含了观察者的注册、删除、通知方法
  • 具体观察者ConcreteObserver:观察者接口的具体实现,每个具体

8.1.5观察者模式

package com.technologystatck.designpattern.mode.observer;import java.util.ArrayList;
import java.util.List;public class Observers {public static void main(String[] args) {//创建具体主题对象ConcreteSubject concreteSubject = new ConcreteSubject();//创建具体观察者对象Observer concreteObserverA = new ConcreteObserver();Observer concreteObserverB = new ConcreteObserver();//注册观察者concreteSubject.registerObserver(concreteObserverA);concreteSubject.registerObserver(concreteObserverB);//调用主题方法concreteSubject.setState("有新的观察者注册");}
}//主题接口(主题)
interface Subject{//注册观察者void registerObserver(Observer observer);//移除观察者void removeObserver(Observer observer);//通知观察者void notifyObserver();
}//观察者接口(观察者)
interface Observer{//更新方法void update(String message);
}//具体主题实现
class ConcreteSubject implements Subject{//观察者列表private List<Observer> observers = new ArrayList<>();//状态private String state;//注册观察者方法(注册)@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}//移除观察者方法(移除)@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}//通知观察者方法(通知)//遍历观察者列表,并通知每个观察者更新状态@Overridepublic void notifyObserver() {for (Observer observer : observers) {observer.update(state);}}//更新状态public void setState(String state) {this.state = state;notifyObserver();}
}
//具体观察者实现
class ConcreteObserver implements Observer{//更新方法@Overridepublic void update(String message) {System.out.println(message);}
}

8.1.6实战

8.1.6.1题目描述

小明所在的学校有一个时钟(主题),每到整点时,它就会通知所有的学生(观察者)当前的时间,请你使用观察者模式实现这个时钟通知系统。

注意点:时间从 0 开始,并每隔一个小时更新一次。

8.1.6.2输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示学生的数量。

接下来的 N 行,每行包含一个字符串,表示学生的姓名。

最后一行是一个整数,表示时钟更新的次数。

8.1.6.3输出描述

对于每一次时钟更新,输出每个学生的姓名和当前的时间。

8.1.6.4代码
package com.technologystatck.designpattern.mode.observer;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取学⽣数量int N = scanner.nextInt();// 创建时钟Clock clock = new Clock();// 注册学⽣观察者for (int i = 0; i < N; i++) {String studentName = scanner.next();clock.registerObserver(new Student(studentName));}// 读取时钟更新次数int updates = scanner.nextInt();// 模拟时钟每隔⼀个⼩时更新⼀次for (int i = 0; i < updates; i++) {clock.tick();}}
}// 观察者接⼝
interface Observer {void update(int hour);
}
// 主题接⼝
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}
// 具体主题实现
class Clock implements Subject {private List<Observer> observers = new ArrayList<>();private int hour = 0;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(hour);}}public void tick() {hour = (hour + 1) % 24; // 模拟时间的推移notifyObservers();}
}
// 具体观察者实现
class Student implements Observer {private String name;public Student(String name) {this.name = name;}@Overridepublic void update(int hour) {System.out.println(name + " " + hour);}
}

8.1.7总结

  • 优点:可以灵活的增加 / 删除观察者对象,而不影响其他相关对象的功能
  • 总结:定义一对多的依赖关系,让多个观察者对象同时监听某一主题对象的状态变化,实现自动更新
  • 场景:适用于一个对象的状态变化会影响到其他对象,并且希望这些对象在状态变化时能够自动更新的情况

这篇关于笨蛋学设计模式行为型模式-观察者模式【14】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625232

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子