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

设计模式⑤ :一致性

一、前言

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

二、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

相关文章:

设计模式⑤ :一致性

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

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具有更深的网络结构&#xff0c;采用relu激活函数。 AlexNet 参数更多&#xff0c;计算量更大&#xff0c;计算速度更慢&#xff0c;精度更高。 netnn.Sequential(nn.Conv2d(1,96,kernel_size11,stride4,padding1),nn.ReLU(),nn.MaxPool2d(kernel…...

2024新年烟花代码完整版

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

Fontfabric:一款字体与设计的完美结合

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

Python爬虫—requests模块简单应用

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

江科大STM32

参考&#xff1a; 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&#xff1a;https://blog.csdn.net/weixin_62127790/article/details/132…...

银河麒麟Kylin-Server-V10-SP3使用ISO镜像搭建本地内网YUM/DNF源cdrom/http

机房服务器安装一般是内网环境&#xff0c;需要配置本地的YUM/DNF源。本文介绍通过ISO镜像搭建内网环境的UM/DNF源 准备工作&#xff1a; 提前准备好Kylin-Server-V10-SP3的ISO镜像文件。 本机IP地址&#xff1a;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.思路 找最长对角线&#xff0c;很显然直接比较a^2 b ^ 2就行 注意更新时考虑对角线长度相等时候去面积最大 2.代码 class Solution { publ…...

String intern()方法

String intern 方法有什么作用? String.intern() 是一个 native&#xff08;本地&#xff09;方法&#xff0c;其作用是将指定的字符串对象的引用保存在字符串常量池中&#xff0c;并返回常量池中对应的字符串引用。 当使用字面量创建字符串时&#xff0c;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 开发基础&#xff08;九&#xff09;forEach 一、基础使用 Entry Component struct Index {// 创建一个变量&#xff0c;用来存储图片网络网址imageUrl: string https://gw.alicdn.com/imgextra/i2/2201227850912/O1CN01B7gVvP1Ibk6HMiDRz_!!2201227850912.jpg_Q75.…...

【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步资源同步)、事件标记组(与或多个任务)

上一课&#xff1a; 【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能 文章目录 1 信号量1.1 简介1.2…...

PMP报考流程?

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

【EI会议征稿通知】2024年机器学习与智能计算国际学术会议(MLIC 2024)

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

第八篇 提升网页性能:深入解析HTTP请求优化策略(三)

文章目录 1. 缓存策略设计1.1 HTTP缓存机制1.1.1 强缓存&#xff08;Cache-Control/Expires&#xff09;1.1.2 协商缓存&#xff08;ETag/Last-Modified&#xff09; 1.2 缓存位置1.2.1 浏览器缓存1.2.2 代理服务器缓存 1.3 缓存策略选择1.3.1私有缓存1.3.2 公共资源缓存 1.4 V…...

高版本ant-design动态引用icon

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

【SQL】delete 与 truncate 命令的区别

区别 truncatedelete属于 DDL(数据定义语言) 范畴属于 DML(数据操作语言) 范畴删除表数据&#xff0c;不能删除视图数据删除表数据&#xff0c;删除视图数据只可以梭哈删除通过 where 进行选择性删除不涉及事务处理删除表中数据涉及事务处理效率高、但无法撤销效率低&#xff…...

【ITK库学习】使用itk库进行图像分割(四):水平集分割

目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算&#xff0c;进行水平集分割。在itk中&#xff0c;所…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...