装饰品模式介绍

304f7e533a734dc4b43b536cd46fbd4a.jpg

 

装饰器模式是一种结构型设计模式,它允许用户在不改变现有对象的情况下向一个对象添加新的功能。在 Java 中,装饰器模式经常用来动态地给对象添加额外的行为,如日志记录、事务管理、安全检查等。

 

装饰器模式涉及四个主要角色:组件(Component)、具体组件(Concrete Component)、装饰器(Decorator)和具体装饰器(Concrete Decorator)。组件定义了接口,具体组件实现了这个接口,装饰器持有对另一个相同接口的具体组件的引用,并且可以在调用具体组件的方法前后增加自己的行为。具体装饰器则扩展了具体组件,增加了额外的功能。

 

在 Java IO 流库中广泛使用了装饰器模式,比如 `BufferedReader` 和 `FileReader`。你可以先创建一个 `FileReader` 对象,然后使用 `new BufferedReader()` 将其包装起来,这样就获得了缓冲读取的能力。

 

使用装饰器模式的一个简单示例:

 

```java

// 给定一个字符串列表,找出列表中所有字符串的最长公共前缀

public class LongestCommonPrefixFinder {

    public static void main(String[] args) {

        List<String> strings = Arrays.asList("flower", "flow", "flight");

        String longestCommonPrefix = findLongestCommonPrefix(strings);

        System.out.println("最长公共前缀是: " + longestCommonPrefix);

    }

 

    public static String findLongestCommonPrefix(List<String> strings) {

        if (strings == null || strings.isEmpty()) {

            return "";

        }

        String prefix = strings.get(0);

        for (int i = 1; i < strings.size(); i++) {

            while (strings.get(i).indexOf(prefix) != 0) {

                // 如果不是前缀,则不断缩短前缀

                prefix = prefix.substring(0, prefix.length() - 1);

                // 如果前缀缩短为0,说明没有共同前缀

                if (prefix.isEmpty()) {

                    return "";

                }

            }

        }

        return prefix;

    }

}

```

装饰器模式是一种结构型设计模式,它允许在不改变现有对象的基础上向一个对象动态地添加新功能。这种模式在许多情况下非常有用,特别是当你想给对象添加附加行为而不影响其他对象时。例如,在 Java IO 流库中,你可以使用装饰器模式来给 `FileReader` 添加缓冲能力,从而提高读取效率

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公司服务器中的kafka消息中间件挂了,我是如何修复的?

今天的公司的system系统服务在运行过程中&#xff0c;提示连接不上kafuka的消息中间件。但是负责kafka的同事已经离职了&#xff0c;询问公司开发也不知道如何处理&#xff0c;我是如何重启kafka消息中间件使system系统服务正常运行&#xff1f; 查看kafka的安装位置 在下面的…

【C++】---STL之list的模拟实现

【C】---STL之list的模拟实现 一、list模拟实现思路二、结点类的实现三、list迭代器的实现1、ListIterator类2、构造函数3、operator*运算符重载5、operator->运算符重载6、operator&#xff01;运算符重载7、operator运算符重载8、前置9、后置10、前置--11、后置-- 四、lis…

从零开始安装 stable diffusion webui v1.9.3 (windows10)

从零开始安装 stable diffusion webui v1.9.3 (windows10) CUDA 安装 CUDA 12.1 | https://developer.nvidia.com/cuda-toolkit-archive CUDNN 8.x | https://developer.nvidia.com/rdp/cudnn-archive 安装路径 F:/CUDA/v12.1 安装git git官网 | https://git-scm.com/ 安…

Linux文件/目录高级管理一(头歌实训)

目录 任务描述 相关知识 Linux修改文件权限命令 Linux修改所有者权限 Linux修改同组用户权限 Linux修改其他用户权限 编程要求 任务描述 相关知识 Linux修改目录权限命令 Linux修改所有者权限 Linux修改同组用户权限 Linux修改其他用户权限 编程要求 任务描述 相…

3.1设计模式——Chain of Responsibility 责任链模式(行为型)

意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系&#xff0c;将这些对象练成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个对象处理它为止。 实现 其中 Handle定义一个处理请求的接口&#xff1a;&#xff08;可选…

【线段树 区间位运算模板】3117划分数组得到最小的值之和

本文涉及知识点 线段树 区间位运算模板 LeetCode3117. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数组…

机器视觉系统-工业光源什么是低角度打光方式

光路描述&#xff1a;光线与水平面角度 <45称为低角度光。 效果分析&#xff1a;低角度照射&#xff0c;被侧物表面平整部分的反射光无法进入入镜头&#xff0c;图像效果表现为灰度值较低&#xff1b;不平整部分的反射光进入镜头&#xff0c;图像效果表现为灰度值较高。 主要…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 &#x1f31e;前言 &#x1f3de;️1. 单元测试的理论基础 &#x1f30a;1.1 单元测试是什么 &#x1f30a;1.2 单元测试的好处 &#x1f30a;1.3 单元测试的要求 &#x1f30a;1.4 测试框架-Junit4的介绍 &#x1f30a;1.5 单元测试为什么要mock &#x1f3de;️…

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章&#xff1a; Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚&#xff0c;那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding&#xff0c;我们不妨看一眼Transformer的…

7.MyBatis 操作数据库(初阶)

文章目录 1.什么是MyBatis2.为什么要学习 MyBatis&#xff1f;3.通过spring框架创建MyBatis项目3.1使用MyBatis查询数据库3.2 mysql连接不上报错解决方法 4.MyBatis的基础操作4.1企业建表规范&#xff1a;4.2MyBatis基本实现4.3单元测试4.4使用MyBatis可能遇到的问题4.5配置MyB…

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

CentOS8/RHEL8 root密码破解

我们知道root是CentOS8/RHEL8系统的管理员用户&#xff0c;一般情况下&#xff0c;我们是不会把其密码忘记的&#xff0c;如果万一忘记了&#xff0c;如果破解root密码呢&#xff0c;今天就为大家详细讲讲。 1.CentOS8/RHEL8 root密码破解 1.默认安装及默认配置情况下&#x…

如何申请免费SSL证书,把网站升级成HTTPS

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是一种用于安全数据传输的网络协议&#xff0c;它可以有效地保护网站和用户之间的通信安全。然而&#xff0c;要使一个网站从HTTP升级到HTTPS&#xff0c;就需要一个SSL证书。那么&#xff0c;如何申请免费的…

批量归一化(部分理解)

目的与疑惑 在深度学习中&#xff0c;每层输入数据的分布可能因为前一层参数的微小变动而有较大变化&#xff0c; 这种现象称为内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;。 批量归一化通过规范化层输入来减少内部协变量偏移&#xff0c;使网络更稳定&a…

Java集成结巴中文分词器、Springboot项目整合jieba分词,实现语句最精确的切分、自定义拆词

文章目录 一、jieba介绍二、集成三、原理四、自定义拆词4.1、方式一&#xff1a;在源码的dict.txt中修改然后重新打包(推荐)4.2、新建文件自定义拆词 五、其他问题 一、jieba介绍 jieba是一个分词器&#xff0c;可以实现智能拆词&#xff0c;最早是提供了python包&#xff0c;…

【产品经理修炼之道】- 如何从0到1搭建B端产品

随着数字化转型的不断深化,B端产品也面临着升级。本文总结分析了如何从0到1搭建B端产品,希望对你有所帮助。 背景 随着公司数字化转型的不断的推进和实施,数字化转型成功越来越明显的体现在财务报上,这也增强了管理层对数字转型的信心,在推进中我们也发现几年建设的系统的…

Aigtek:介电弹性体高压放大器在软体机器人研究中的应用

近年来软体机器人的研究成为目前机器人研究领域的热点&#xff0c;由于软体材料的自由度可以根据需求自由变化&#xff0c;因此软体机器人有着极高的灵活性&#xff0c;而且软体机器人因其材料的柔软性有着很好的人机交互性能和安全性。它的出现成功解决了传统的刚性机器人人机…

Django与mysqlclient链接不成功

先检查自己的python是什么版本&#xff0c;是64位还是32位&#xff0c;这个自己去网上查。 我的是32位的&#xff0c;因为直接pip下载不了&#xff0c;网上也没有32位的whl&#xff0c;所以卸载重装一个64位的3.9.6的python 网上直接搜mysqlclient&#xff0c;找到对应py39也…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX&#xff08;System Package Data Exchange&#xff09;格式是一种用于描述软件组件&#xff08;如源代码&#xff09;的规范&#xff0c;它提供了一种标准化的方法来描述软件组件的元数据&#xff0c;包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

家庭环境如何异地组网装修?

家庭异地组网装修是如今越来越受到人们关注的问题。在现代社会中&#xff0c;家庭成员经常因为各种原因而分散在不同的地区。这种情况下&#xff0c;如何实现家庭网络的高效通信变得尤为重要。本文将介绍一款异地组网产品——【天联】组网&#xff0c;它能够帮助家庭解决异地组…