服务网络营销的含义/广州排前三的seo公司
一、前言
有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。
二、Composite 模式(组合模式)
Composite 模式 :容器与内容的一致性
1. 介绍
能够使容器与内容具有一致性,创造出具有递归结构的模式就是 Composite 模式(组合模式)。
Composite 模式中登场的角色
- Leaf (树叶):表示“内容”的角色,在该角色中不能放入其他角色。
- Composite(复合物):表示容器的角色,可以在其中放入 Leaf 角色和 Composite 角色。
- Component :使用 Leaf 和 Composite 角色具有一致性的角色。Component 角色是 Leaf 角色和 Composite角色的父类。
- Client :使用 Composite 模式的角色。
类图如下:
Demo如下:
// 条目,父级接口
public interface Entry {/*** 获取文件名** @return*/String getName();/*** 获取文件大小** @return*/int getSize();/*** 添加目录,默认抛出异常** @param entry* @return*/default Entry addEntry(Entry entry){throw new RuntimeException();}/*** 打印目录*/default void printList() {printList("");}/*** 打印目录** @param prefix*/default void printList(String prefix){System.out.println(prefix + "/" + thisPath());}default String thisPath() {return getName() + "(" + getSize() + ")";}
}// 文件类型
public class File implements Entry {private String name;private int size;public File(String name, int size) {this.name = name;this.size = size;}@Overridepublic String getName() {return name;}@Overridepublic int getSize() {return size;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + thisPath());}
}// 文件夹类型
public class Directory implements Entry {private String name;private List<Entry> entries = Lists.newArrayList();public Directory(String name) {this.name = name;}@Overridepublic String getName() {return name;}@Overridepublic int getSize() {return entries.stream().mapToInt(Entry::getSize).sum();}@Overridepublic Entry addEntry(Entry entry) {entries.add(entry);return this;}@Overridepublic void printList(String prefix) {System.out.println(prefix + "/" + thisPath());entries.forEach(entry -> entry.printList(prefix + "/" + name));}
}// main 方法:输出每个文件夹下的目录及大小
public class CompositeDemoMain {public static void main(String[] args) {Entry rootDir = new Directory("root");Entry binDir = new Directory("bin");Entry tmpDir = new Directory("tmp");Entry usrDir = new Directory("usr");Entry hanakoDir = new Directory("hanako");usrDir.addEntry(hanakoDir);rootDir.addEntry(binDir);rootDir.addEntry(tmpDir);rootDir.addEntry(usrDir);hanakoDir.addEntry(new File("memo.tex", 10));binDir.addEntry(new File("vi", 1000));binDir.addEntry(new File("latex", 2000));rootDir.printList();}
}
输出如下:
以上面的例子为例, Entry 可能是 File 的实现,也可能是 Directory 的实现,但无论是哪种实现,都可以通过 getSize 得到他的大小。这就是 Composite 模式的特征:容器与内容的一致性。
2. 应用
暂时没想到
个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑):
- 项目A中,需要对敏感词构建出一个树状图,以此进行脱敏处理。构建出的敏感词数据结构即是一个树状图结构。具体逻辑这里不再写出,类似下图(详参 https://mp.weixin.qq.com/s/7Rm87J7PJcA8KKwM8m1yVQ):
3. 总结
通常来说,树结构的数据结构都适用于 Composite 模式。
扩展思路:
- 多个和单个的一致性 :使用 Composite 模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当做一个对象进行处理。通常来说树结构的数据结构都适用于 Composite 模式。如
相关模式:
- Command 模式:使用 Command 模式编写宏命令时使用了 Composite 模式
- Visitor 模式:可以使用 Visitor 模式访问 Composite 模式中的递归结构
- Decorator 模式:Composite 模式通过 Component 角色使容器(Composite 角色) 和 内容 (Leaf 角色)具有一致性。Decorator 模式使装饰框和内容具有一致性。
三、Decorator 模式(装饰器模式)
Decorator 模式 :装饰边框与被装饰物的一致性
1. 介绍
Decorator 模式即为对象添加装饰的设计模式。如一个蛋糕,只涂上奶油就是奶油蛋糕,如果再加上草莓就是草莓奶油蛋糕,不过不管加了什么,其核心都是蛋糕。装饰器模式与之类似,不断地为对象添加装饰的模式即为装饰器模式。
登场的角色:
- Component :增加功能时的核心角色。
- ConcreteComponent :该角色是实现了 Component 角色所定义的接口的具体角色。
- Decorator (装饰物):该角色具有与 Component 角色相同的接口,在它内部保存了被装饰的对象(Component 角色)。Decorator 角色知道自己要装饰的角色。
- ConcreteDecorator (具体的装饰物):该角色是具体的 Decorator 角色。
类图如下:
2. 应用
-
Dubbo 在进行服务间调用时会通过 Invoker 来调用,如下图,从 Invoker 的调用过程也可以看出 Invoker 是通过装饰器模式修饰的。
-
Java IO 包中IO类,如下可以自由组合出很多IO操作。
Reader reader = new FileReader("/demo.txt");Reader reader = new BufferedReader(new FileReader("/demo.txt"));Reader reader = new LineNumberReader(new BufferedReader(new FileReader("/demo.txt")));
个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑):
-
项目 A 中,需要对外提供脱敏后的数据,但是程序内部使用未脱敏的数据,则可以通过装饰器模式,构建一个脱敏的实现来对外提供数据,如下:FullDataHolder 是程序内部使用未脱敏的数据,DesensitizationDataHolder 则对 FullDataHolder 进行了装饰,对外提供脱敏后的数据。
// 数据持有接口 public interface DataHolder {/*** 获取数据* @return*/String getData(); }// 全量数据持有者 public class FullDataHolder implements DataHolder {@Overridepublic String getData() {return "全量敏感数据";} }// 脱敏数据持有者 public class DesensitizationDataHolder implements DataHolder{/*** 数据持有者*/private DataHolder dataHolder;public DesensitizationDataHolder(DataHolder dataHolder) {this.dataHolder = dataHolder;}@Overridepublic String getData() {return dataHolder.getData().replace("敏感", "**");} }public class DemoMain {public static void main(String[] args) {DataHolder dataHolder = new FullDataHolder();System.out.println(dataHolder.getData());// 使用 DesensitizationDataHolder 对 FullDataHolder进行装饰,输出脱敏后的数据DataHolder desensitizationDataHolder = new DesensitizationDataHolder(dataHolder);System.out.println(desensitizationDataHolder.getData());} }
输出如下:
3. 总结
扩展思路:
- 接口的透明性 : 装饰边框与被装饰物具有一致性,因为被装饰物的接口并不会因为被装饰而被隐藏起来。
- 在不改变被装饰物的前提下增加功能 :由于装饰边框和被装饰物的暴露接口相同,我们可以进行多次装饰,越装饰功能则越多,并且不需要对被装饰的类做任何处理。即实现了不修改被装饰的类即可增加功能。
- 可以动态地增加功能 :Decorator 模式中使用了委托,使得类之间形成了弱关联关系,因此在不改变框架代码的情况下就可以生成一个与其他对象具有不同关系的新对象。
- 只需要一些装饰物即可添加许多功能 :装饰边框可以提供多个,即使每个装饰边框增加的功能很简单,但是可以通过多个装饰边框的嵌套来增加更复杂的功能。
装饰器模式的缺点在于:如果装饰器的增加的功能较小,可能会导致程序中增加许多功能类似的很小的类。
相关设计模式:
- Adapter 模式 :Decorator 模式可以在不改变被装饰物的接口的前提下,为被装饰物添加边框。Adapter 模式适用于两个不同的接口。
- Strategy 模式 :Decorator 模式可以像改变装饰物的边框或是为被装饰物添加多重边框那样,来增加类的功能。Strategy 模式通过整体地替换算法来改变类的功能。
参考文章
https://mp.weixin.qq.com/s/7Rm87J7PJcA8KKwM8m1yVQ
相关文章:

设计模式⑤ :一致性
一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。 …...

Android通过Recyclerview实现流式布局自适应列数及高度
调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…...

AlexNet(fashion-mnist)
前言 AlexNet相较于LeNet-5具有更深的网络结构,采用relu激活函数。 AlexNet 参数更多,计算量更大,计算速度更慢,精度更高。 netnn.Sequential(nn.Conv2d(1,96,kernel_size11,stride4,padding1),nn.ReLU(),nn.MaxPool2d(kernel…...

2024新年烟花代码完整版
文章目录 前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript 新年祝福 前言 在这个充满希望和激动的2024年,新的一年即将拉开帷幕,而数字科技的创新与发展也如火如荼。烟花绚丽多彩的绽放,一直以来都是新年庆典中不可或缺的元素。…...

Fontfabric:一款字体与设计的完美结合
一、产品介绍 Fontfabric是一款由国际字体设计公司Fontfabric开发的字体设计软件。它提供了一整套完整的字体设计工具,让用户可以轻松地创建、设计和定制自己的字体。Fontfabric拥有丰富的字体库,包括各种风格和类型,能够满足用户在不同场景…...

Python爬虫—requests模块简单应用
Python爬虫—requests模块简介 requests的作用与安装 作用:发送网络请求,返回响应数据 安装:pip install requests requests模块发送简单的get请求、获取响应 需求:通过requests向百度首页发送请求,获取百度首页的…...

江科大STM32
参考: https://blog.csdn.net/weixin_54742551/article/details/132409170?spm1001.2014.3001.5502 https://blog.csdn.net/Johnor/article/details/128539267?spm1001.2014.3001.5502 SPI:https://blog.csdn.net/weixin_62127790/article/details/132…...

银河麒麟Kylin-Server-V10-SP3使用ISO镜像搭建本地内网YUM/DNF源cdrom/http
机房服务器安装一般是内网环境,需要配置本地的YUM/DNF源。本文介绍通过ISO镜像搭建内网环境的UM/DNF源 准备工作: 提前准备好Kylin-Server-V10-SP3的ISO镜像文件。 本机IP地址:192.168.40.201 镜像存放目录/data/iso/Kylin-Server-V10-SP3-Ge…...

力扣第 379 场周赛VP
目录 一1.思路2.代码 二1.思路2.代码 三1.思路2.代码 四1.思路2.代码 链接:https://leetcode.cn/contest/weekly-contest-379/ 一 1.思路 找最长对角线,很显然直接比较a^2 b ^ 2就行 注意更新时考虑对角线长度相等时候去面积最大 2.代码 class Solution { publ…...

String intern()方法
String intern 方法有什么作用? String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,并返回常量池中对应的字符串引用。 当使用字面量创建字符串时,Java 会在编译期间自…...

springboot 物业管理系统
springboot mysql mybatisthymeleaf 基础信息管理 房屋信息 用户信息 业主信息 租房信息 公告管理 日常管理 财务管理...

K8S--- kubectl auth
该命令可以校验用户或者serviceaccount是否有对应的权限 [root@yyzc-zjjcs01 ~]# /opt/kubernetes/bin/kubectl --kubeconfig /opt/kubernetes/conf/default-admin.kubeconfig auth --help Inspect authorization Available Commands: can-i Check whether an action is allowe…...

HarmonyOS 开发基础(九)forEach
HarmonyOS 开发基础(九)forEach 一、基础使用 Entry Component struct Index {// 创建一个变量,用来存储图片网络网址imageUrl: string https://gw.alicdn.com/imgextra/i2/2201227850912/O1CN01B7gVvP1Ibk6HMiDRz_!!2201227850912.jpg_Q75.…...

【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步资源同步)、事件标记组(与或多个任务)
上一课: 【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 文章目录 1 信号量1.1 简介1.2…...

PMP报考流程?
项目管理相关证书,PMP是一个不错的选择,尤其是小白朋友。 PMP 是项目管理的一个入门证书,理论知识很全面,涵盖了项目管理的全流程,可作为日常工具参考书、完全小白的可以先考一个PMP学好理论,再考一个PRIN…...

【EI会议征稿通知】2024年机器学习与智能计算国际学术会议(MLIC 2024)
2024年机器学习与智能计算国际学术会议(MLIC 2024) 2024 International Conference on Machine learning and intelligent computing 智能计算与机器学习被广泛应用于大数据分析、人工智能、智能制造、智能交通、智能电网、智慧城市、智慧医疗、金融科…...

第八篇 提升网页性能:深入解析HTTP请求优化策略(三)
文章目录 1. 缓存策略设计1.1 HTTP缓存机制1.1.1 强缓存(Cache-Control/Expires)1.1.2 协商缓存(ETag/Last-Modified) 1.2 缓存位置1.2.1 浏览器缓存1.2.2 代理服务器缓存 1.3 缓存策略选择1.3.1私有缓存1.3.2 公共资源缓存 1.4 V…...

高版本ant-design动态引用icon
需求 最近在更新自己的博客系统,从 vue2 升到 vue3,同步的也把 ant-design 从 1.7.8 跨越多个大版本升级到了 4.0.8,发现菜单上的 icon 报错了。 查询官方文档发现自从 2.0 版本以后的 icon 就不再支持通过 <a-icon /> 组件动态 type…...

【SQL】delete 与 truncate 命令的区别
区别 truncatedelete属于 DDL(数据定义语言) 范畴属于 DML(数据操作语言) 范畴删除表数据,不能删除视图数据删除表数据,删除视图数据只可以梭哈删除通过 where 进行选择性删除不涉及事务处理删除表中数据涉及事务处理效率高、但无法撤销效率低ÿ…...

【ITK库学习】使用itk库进行图像分割(四):水平集分割
目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算,进行水平集分割。在itk中,所…...

Kali Linux——aircrack-ng无线教程
目录 一、准备 二、案例 1、连接usb无线网卡 2、查看网卡信息 3、开启网卡监听 4、扫描wifi信号 5、抓取握手包 6、强制断开连接 7、破解握手包 三、预防 一、准备 1、usb无线网卡(笔记本也是需要用到) 2、密码字典(Kali 系统自带…...

15.vdo管理
vdo管理 文章目录 vdo管理一、VDO基本概念二、常用操作三、验证VDO卷 一、VDO基本概念 VDO(Virtual Data Optimize虚拟数据优化) 通过压缩或删除存储设备上的数据来优化存储空间。VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部。这些块设备也…...

安全漏洞周报(2024.01.01-2023.01.08)
漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍: 某友CRM系统是一款综合性的客户关系管理软件,旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能,包括销售管理、市场营销、客户服…...

msckf-vio 跑Euroc数据集,并用evo进行评估
所需材料: Euroc数据集主页:https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码:https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码,可参考https://blog.csdn.ne…...

大模型LLM在 Text2SQL 上的应用实践
一、前言 目前,大模型的一个热门应用方向Text2SQL,它可以帮助用户快速生成想要查询的SQL语句,再结合可视化技术可以降低使用数据的门槛,更便捷的支持决策。本文将从以下四个方面介绍LLM在Text2SQL应用上的基础实践。 Text2SQL概…...

数据库:园林题库软件(《城市绿地设计规范》答题卷一 )
《城市绿地设计规范》答题卷一 填空题 1、城市绿地设计应贯彻人与自然和谐共存、可持续发展、经济合理等基本原则,创造良好生态和景观效果,促进人的身心健康。 2、城市绿地 urban green space 以植物为主要存在形态,用于改善城市生态&am…...

MySQL之视图外连接、内连接和子查询的使用
目录 一. 视图 1.1 含义 1.2 视图的基本语法 1.3 视图的实操 二. 外连接、内连接和子查询的使用 2.1 SQL脚本 2.2 使用外连接、内连接和子查询进行解答 三. 思维导图 一. 视图 1.1 含义 视图(view)是一种虚拟存在的表,是一个逻辑表&#x…...

MoE模型性能还能更上一层楼?一次QLoRA微调实践
Fine-Tuning Mixtral 8x7B with QLoRA:Enhancing Model Performance 🚀 编者按:最近,混合专家(Mixture of Experts,MoE)这种模型设计策略展现出了卓越的语言理解能力,如何在此基础上进一步提升 MoE 模型的性能成为业界…...

Java线程学习笔记
1、判断线程存活 1. 当线程run()或者call()方法执行结束,线程进入终止状态 2. 当线程内发生异常,并且异常没有被捕获,线程进入终止状态 3. 线程调用stop()方法后,线程进入终止状态(不推荐使用) 当主线程结束时,其他线程…...

平面光波导_三层均匀平面光波导_射线分析法
平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导: 折射率沿 x x x 方向有变化,沿 y y y、 z z z 方向没有变化三层:芯区( n 1 n_1 n1) > > > 衬底( n 2 n_2 n2) ≥ \geq ≥ 包层( n 3 n_3 n3)包层通常为空…...