观察者模式

news2024/11/14 18:02:33

目录

一、观察者模式解决了哪些问题:

二、体检的小栗子

三、什么是观察者模式

四、代码实现


一、观察者模式解决了哪些问题:

  • 对象之间的一对多依赖关系应该在不使对象紧密耦合的情况下定义。
  • 应该确保当一个对象改变状态时,自动更新无限数量的依赖对象。
  • 一个对象可以通知无限数量的其他对象应该是可能的。

二、体检的小栗子

举一个生活中常见的小栗子。你想要了解自己的身体状况。

方案一:

想要了解自己眼睛,健康状况,去A医院,挂一个眼科进行检查

想要了解自己血糖,健康状况,去B医院,挂一个内科进行检查

想要了解自己肝功能状态,,去C医院,挂一个号进行检查。

方案二:做一个体检项目

做一个体检项目,项目里包含身高、体重、视力、血糖、肝功能等一系列检查。

如果我还想检查更多的项目,可能在体检套餐里加入特定的体检项目。

观察者模式:

体检(类)-检查(方法)

写一个体检接口,里面有检查方法。然后多个实现类:

体重类,需要实现体检接口的检查方法

身高类,需要实现体检接口的检查方法。

目的就是把所有的类,在类型上统一,都归属于体检类,这样就可以组成一个体检集合,然后遍历每个元素的检查方法

--------------------------------------------------------------------------------------------------------------------------

三、什么是观察者模式

主要解决:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

四、代码实现

需要进行体检的人类Person

package ObserverDemo;

import lombok.Data;

@Data
public class Person {
    private String name;
    private int height;
    private int weight;
    private int vision; // 视力
    private String lung;// 肺部
    private String blood; // 血液
    
}

体检接口HealthCheckupIObserver,有检查身体的方法

package ObserverDemo;

public interface HealthCheckupIObserver<T> {
    void check(T t);
}

体检医院内,视力科室(Eye类)实现体检接口,来检查视力

package ObserverDemo;

public class Eye implements HealthCheckupIObserver<Person>{
    @Override
    public void check(Person person) {
        System.out.println("进行视力检查");
    }
}

体检医院内,内科室实现体检接口,来检查肺部

package ObserverDemo;

public class InternalMedicine implements HealthCheckupIObserver<Person>{
    @Override
    public void check(Person person) {
        System.out.println("内科进行肺部检查");
    }
}

体检医院内,外科科室实现体检接口,来检查身高

package ObserverDemo;

public class Surgery implements HealthCheckupIObserver<Person>{
    @Override
    public void check(Person person) {
        System.out.println("外科进行身高检查");
    }
}

体检单ObserverManager

将各种体检项目,加入到这个体检单里。也可以将体检单里的某一体检项目剔除。

package ObserverDemo;

import com.google.common.collect.Lists;


import java.util.List;

public class ObserverManager {
    // 各种检查项目,组成一个体检单/list
    private List<HealthCheckupIObserver> observers;

    // 构造器,私有,不能被new
    private ObserverManager(){
        observers = Lists.newArrayList(
                new InternalMedicine(),// 将 内科检查,加入到体检单
                new Eye(), // 将眼科检查,加入到体检单
                new Surgery() // 将外科检查,加入到体检单
        );
    }


    // ClassHolder属于静态内部类,在加载类Demo03的时候,只会加载内部类ClassHolder,
    // 但是不会把内部类的属性加载出来
    private static class ClassHolder{
        // 这里执行类加载,是jvm来执行类加载,它一定是单例的,不存在线程安全问题
        // 这里不是调用,是类加载,是成员变量
        private static final ObserverManager holder =new ObserverManager();

    }

    public static ObserverManager of(){//第一次调用getInstance()的时候赋值
        return ClassHolder.holder;
    }
    
    public void check(Person person){
        for (HealthCheckupIObserver observer:observers){
            observer.check(person);
        }
    }


}

小明同学,使用体检单进行体检。

package ObserverDemo;

public class APP {
    public static void main(String[] args) {
        Person person = new Person();
        ObserverManager.of().check(person);
    }
}

感觉观察者的核心就是:

定义一个观察者接口,具体执行逻辑的类来实现它。就是为了能够将这几个实现类,组合成一个集合。然后调用遍历每个元素的方法。

在这个例子里,观察者的核心就是:

将各个检查项目,组装成了一个体检单。(体检单里可以增加或者剔除某个体检项目)

UML类图

项目结构:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5-5:显示系统的通知

通知列表 显示评论、点赞、关注三种类型的通知。 通知详情 分页显示某一类主题所包含的通知。 未读消息 在页面头部显示所有的未读消息数量 通知存在message表里面 修改MessageMapper.java package com.nowcoder.community.dao;import com.nowcoder.community.entity.Messa…

毕业2年,跳槽到我们公司拿18K,这就是00后卷王带来的压迫感吗?

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不…

AI 也会写代码了,但我并不担心

如果你比较关注人工智能&#xff0c;可能会注意到最近圈子的人都在刷屏一个 AI 玩意&#xff0c;叫 ChatGPT 。我一直关注的和菜头在他的公众号槽边往事上就接连写了几篇文章。为什么和菜头是男的&#xff0c;读者却要叫他“婶婶”怎么把AI逼到生气水文与干货如果看完上面的第一…

一行代码 网页变灰

背景 想必大家都感受到了&#xff0c;很多网站、APP 在昨天都变灰了。 先来感受一下变灰后的效果。 让网页变为黑白配色&#xff0c;是个常见的诉求。而且往往是突如其来的诉求&#xff0c;是无法预知的。 当发生这样的需求时&#xff0c;我们需要迅速完成变更发布。 这种…

机器学习 决策树 随机森林

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比总结参考 b站视频 【决策树、随机森林】附源码&#xff01;&#xff01;超级简单&#xff0c;同济大佬手把手带你学决策树决策树模型及案例&…

收藏 外贸企业必备的跨境电商B2B出口报关完整指南

跨境企业想要将货物出口到国外&#xff0c;报关是重要步骤之一&#xff0c;它是货物合法进出国境的通行证。许多初入跨境电商行业的B2B企业在报关上由于无人指引走了许多弯路&#xff0c;浪费了时间。 一.跨境出口模式 根据海关总署规定&#xff0c;跨境电商出口的监管模式分为…

QDataStream(数据流)

QDataStream类实现将QIODevice的二进制数据串行化。一个数据流就是一个二进制编码信息流&#xff0c;独立于主机的操作系统&#xff0c;CPU或字节顺序。QDataStream可以实现c的基本数据类型的串行化。 构造函数&#xff1a; 常用函数 &#xff1a; atEnd()是否到达结束位置re…

基于jsp+ssm的旅游活动报名系统-计算机毕业设计

项目介绍 本系统主要采JSP语言进行编写&#xff0c;本系统数据库采用数据处理功能强大的MySQL来建立 管理员可以通过结伴休闲平台进行旅行社管理、个人活动管理、旅行社活动管理、客户管理、用户管理等。个人用户则可通过结伴休闲平台对进行发布活动、结伴活动等。旅行社用户…

STC15 - ExternalRAM_enable()/InternalRAM_enable()

文章目录STC15 - ExternalRAM_enable()/InternalRAM_enable()概述实验环境MCU的规格区别IAP15F2K61S2的使用限制实验的组合公用测试代码1. 没有焊接外部RAM ExternalRAM_enable()2. 没有焊接外部RAM InternalRAM_enable()3. 焊接外部RAM ExternalRAM_enable()4. 焊接外部RAM…

世界杯狂欢季,家居品牌仅靠4位UP增长2000wB站声量

时隔四年&#xff0c;2022年卡塔尔世界杯于11月21日正式开始&#xff0c;直至目前比赛进度已过半程&#xff0c;这场世界赛事备受各国瞩目&#xff0c;全网有关于“足球”的运动信息接踵而至。 飞瓜数据&#xff08;B站版&#xff09;显示&#xff0c;B站平台带有“世界杯”标…

React源码之概念篇

React主要的三部分 这是从ReactDom.render后触发的步骤 调度协调渲染 设计理念 首先在React中需要在浏览器刷新一次就需要执行如下的步骤&#xff1a; JS脚本执行->样式布局->样式绘制&#xff0c;如果js执行时间超过了16.6ms&#xff0c;那么就没有时间留给样式布局…

[附源码]计算机毕业设计良辰之境影视评鉴系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【viper】go 配置管理神器viper使用详解

目录一、viper简介二、基本使用1.viper基本配置2.读取配置3.自定义配置源4.注册别名4.获取环境变量5.获取命令行参数6.多实例使用7.监听配置变化三、读取远程配置四、保存配置一、viper简介 viper是一个应用程序解决方案&#xff0c;它支持在应用程序内使用&#xff0c;特性如…

基于元胞自动机的人员疏散模拟器研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[前端面试题]:数组去重的几种方法

总结一些日常需要用到的一些api&#xff0c;也是在一些面试中会经常出现的题目&#xff0c;今天分享的是数组去重的几个不同的方法&#xff0c; 同时文章也被收录到我的《JS基础》专栏中&#xff0c;欢迎大家点击收藏加关注。 给大家推荐一个实用面试题库 1、前端面试题库 &am…

魔兽世界开服架设教程—魔兽国服停服时间已确定!玩家该何去何从

《魔兽世界》国服停止运营时间定在&#xff0c;2023年1月24日0点起 近期随着暴雪和网易公司先后发出的公告&#xff0c;《魔兽世界》国服关服时间已经十分确定了&#xff0c;国服停运时间定在明年的1月24号0点起正式关服。随着国服将关闭&#xff0c;魔兽私服即将崛起。毕竟在游…

【Java面试】并发

文章目录线程有那些状态&#xff1f;一个程序来显示状态切换过程正常执行流程阻塞执行流程等待执行流程说说线程池的核心参数wait和sleep的区别Lock和synchronized的区别Lock中Condition的使用说说Java中的悲观锁与乐观锁乐观锁悲观锁Hashtable和ConcurrentHashMap的区别&#…

【玩转算法】(初始)动态规划

本期主题&#xff1a;动态规划&#xff0c;及其相关oj题。博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐 &#x1f341;1&#xff09;DP定义 动态规划是分治思想的延伸&#xff0c;通俗一点来说…

核酸检测预约系统毕业设计,核酸检测系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的疫情核酸检查预约系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞&#xff0c;最近正好有一些闲暇时间&#xff0c;可以看一看。 因为环境上总是有一些小问题&#xff0c;所以会在本地和云服务器切换着调试 0x02 环境搭建 太坑了&#xff0c;我的建议是用本地搭建的方法&…