当前位置: 首页 > news >正文

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

 🔍 目的


使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。

 🔍 解释


抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口

真实世界例子

考虑由多个部分组成的计算机。 但是,我们不知道特定计算机是否真的拥有所有零件,或者仅仅是零件中的一部分。 我们的计算机是动态而且非常灵活的。

通俗的说

抽象文档模式允许在对象不知道的情况下将属性附加到对象。

维基百科

面向对象的结构设计模式,用于组织松散类型的键值存储中的对象并使用类型化的视图公开数据。 该模式的目的是在强类型语言中实现组件之间的高度灵活性,在这种语言中,可以在不丢失类型安全支持的情况下,将新属性动态地添加到对象树中。 该模式利用特征将类的不同属性分成不同的接口。

 🔍 程序示例

让我们首先定义基类DocumentAbstractDocument。 它们基本上使对象拥有属性映射和任意数量的子对象。

public interface Document {Void put(String key, Object value);Object get(String key);<T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor);
}public abstract class AbstractDocument implements Document {private final Map<String, Object> properties;protected AbstractDocument(Map<String, Object> properties) {Objects.requireNonNull(properties, "properties map is required");this.properties = properties;}@Overridepublic Void put(String key, Object value) {properties.put(key, value);return null;}@Overridepublic Object get(String key) {return properties.get(key);}@Overridepublic <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) {return Stream.ofNullable(get(key)).filter(Objects::nonNull).map(el -> (List<Map<String, Object>>) el).findAny().stream().flatMap(Collection::stream).map(constructor);}...
}

 接下来,我们定义一个枚举“属性”和一组类型,价格,模型和零件的接口。 这使我们能够为Car类创建静态外观的界面。

public enum Property {PARTS, TYPE, PRICE, MODEL
}public interface HasType extends Document {default Optional<String> getType() {return Optional.ofNullable((String) get(Property.TYPE.toString()));}
}public interface HasPrice extends Document {default Optional<Number> getPrice() {return Optional.ofNullable((Number) get(Property.PRICE.toString()));}
}
public interface HasModel extends Document {default Optional<String> getModel() {return Optional.ofNullable((String) get(Property.MODEL.toString()));}
}public interface HasParts extends Document {default Stream<Part> getParts() {return children(Property.PARTS.toString(), Part::new);}
}

我们准备介绍Car

public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {public Car(Map<String, Object> properties) {super(properties);}
}

完整示例中的Car构造和使用方式。

    LOGGER.info("Constructing parts and car");var wheelProperties = Map.of(Property.TYPE.toString(), "wheel",Property.MODEL.toString(), "15C",Property.PRICE.toString(), 100L);var doorProperties = Map.of(Property.TYPE.toString(), "door",Property.MODEL.toString(), "Lambo",Property.PRICE.toString(), 300L);var carProperties = Map.of(Property.MODEL.toString(), "300SL",Property.PRICE.toString(), 10000L,Property.PARTS.toString(), List.of(wheelProperties, doorProperties));var car = new Car(carProperties);LOGGER.info("Here is our car:");LOGGER.info("-> model: {}", car.getModel().orElseThrow());LOGGER.info("-> price: {}", car.getPrice().orElseThrow());LOGGER.info("-> parts: ");car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}",p.getType().orElse(null),p.getModel().orElse(null),p.getPrice().orElse(null)));// Constructing parts and car// Here is our car:// model: 300SL// price: 10000// parts: // wheel/15C/100// door/Lambo/300

 🔍 类图

Abstract Document Traits and Domain 

 🔍 适用性


使用抽象文档模式当

  • 需要即时添加新属性
  • 你想要一种灵活的方式来以树状结构组织域
  • 你想要更宽松的耦合系统

相关文章:

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…...

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…...

那些年使用过的UA头

一些WAF会根据扫描器UA头进行屏蔽 UA头 在sqlmap 中可以使用 –random-agnet /xx.txt 来更换UA头 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60 Opera/8.0 (Windows NT 5.1; U; en) Mozi…...

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维&#xff0c;提高工作效率。 2、我用代码批判思维&#xff0c;逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员&#xff0c;是哪些重要的专业习惯&#xff0c;让我如此优秀&#xff1f; 2、可以免费获取到的IT资源 1、《软件工程&a…...

软件产品质量模型及其子特性

一、功能性 子特性&#xff1a; 功能的完备性 功能正确性 功能适合性 功能性的依从性 二、性能效率 子特性&#xff1a; 时间特性 资源利用性 容量 性能效率的依从性 三、兼容性 子特性&#xff1a; 共存性 互操作性 兼容性的依从性 四、易用性 子特性&#xff1a; 可辨识性…...

神经网络中的误差反向传播(Backpropagation)方法理解

想象一下&#xff0c;神经网络就像是一个复杂的迷宫&#xff0c;里面有许多交叉路口&#xff08;神经元&#xff09;&#xff0c;每个路口都有指示牌告诉你往哪个方向走&#xff08;权重&#xff09;&#xff0c;而你的目标是找到从入口到出口的最佳路径&#xff0c;使得从起点…...

Day 32 shell变量及运算

一&#xff1a;变量概述 1.什么是变量 ​ 变量来源于数学&#xff0c;是计算机语言中能储存计算结果或能表示值的抽象概念 ​ 变量可以通过变量名访问&#xff0c;在指令式语言中&#xff0c;变量通常是可变的&#xff1b;在某些条件下也是不可变的 2.变量的规则 ​ 命名只…...

八、VUE内置指令

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别&#xff1a;v-text会替换掉节点中的内容&#xff0c;{{x…...

学习笔记:IEEE 1003.13-2003【POSIX PSE53接口列表】

一、POSIX PSE53接口列表 根据IEEE 1003.13-2003&#xff0c;整理了POSIX PSE53接口API&#xff08;一共126个&#xff09;&#xff0c;每个API支持链接查看。 IEEE POSIX接口online搜索链接&#xff1a; The Open Group Base Specifications Issue 7, 2018 edition 详细内…...

springboot logback 日志注入安全问题 统一处理

背景 日志注入一般指的是恶意用户输出换行等内容&#xff0c;混淆正常的日志&#xff0c;导致排查问题是无法正确定位问题&#xff0c;因此&#xff0c;我们需要对要打印的日志内容进行过滤。 但是&#xff0c;如果是每个接口单独处理的话&#xff0c;成本较高&#xff0c;因此…...

linux进阶高级配置,你需要知道的有哪些(13)-Squid代理服务器

1、squid代理的作用&#xff1a;缓存网页对象&#xff0c;减少重复请求 2、代理的基本类型 传统代理&#xff1a;适用于Internet互联网&#xff0c;需明确指定服务端&#xff08;浏览器需要配置&#xff09; 透明代理&#xff1a;适用于共享上网网关&#xff0c;不需要指定服务…...

SpringBoot自动装配(二)

近日&#xff0c;余溺于先贤古哲之文无法自拔。虽未明其中真意&#xff0c;但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰&#xff1a;“臣闻之&#xff1a;‘疑行无名&#xff0c;疑事无功。’君亟定变法之虑&#xff0c;殆无顾天下之议之也。且夫有高人之行者&#xff0c;…...

数据结构 顺序表1

1. 何为顺序表&#xff1a; 顺序表是一种线性数据结构&#xff0c;是由一组地址连续的存储单元依次存储数据元素的结构&#xff0c;通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素&#xff0c;并且支持在任意位置上进行插入和删除操作。在顺序表中&#xf…...

C++基础-编程练习题1

文章目录 一、哥德巴赫猜想二、哥德巴赫猜想2三、打印成绩单四、成绩输入输出五、数组输出奇数位偶数位 一、哥德巴赫猜想 【试题描述】 哥德巴赫提出了以下的猜想&#xff1a;任何一个大于 2 的偶数都可以表示成 2 个质数之和。 质数是指除了 1 和本身之外没有其他约数的数&a…...

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…...

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下&#xff1a; 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 &#xff0c;例如我的个人公众号 htt…...

64K方法数限制原理及解决方案

64K限制的原因 Android APK文件本质上是一个压缩文件&#xff0c;它包含的classes.dex文件是可执行的Dalvik字节码文件&#xff0c;这个.dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。其中包含联网Android Framew…...

产品品牌CRUD

文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties&#xff08;不需要修改&#xff09;2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…...

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮

近日、全球知名科技公司惠普在北京隆重举办了以“用智能&#xff0c;开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会&#xff0c;此次盛会标志着惠普在人工智能领域迈出了重要一步&#xff0c;惠普紧跟时代步伐&#xff0c;推出了更高效、更安全、更灵活的AI PC产…...

python中的数据可视化:极坐标散点图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化&#xff1a; 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...