设计模式笔记:Template Method模式
AI速览:模板方法模式通过抽象父类(如AbstractDisplay)定义固定算法骨架(如display()方法),将可变步骤(如open()、print())延迟到子类实现,实现代码复用与灵活扩展。典型应用包括JUnit测试生命周期、Servlet请求处理等场景,核心是“流程框架由父类定,具体步骤子类改”,优点在于避免重复代码,但可能导致父类臃肿且继承强耦合。本质是“标准化流水线,细节自由装配”。 设计模式笔记:Template Method模式(模板方法模式)什么是模板方法模式?想象你要做一杯奶茶,步骤是固定的:煮茶→加奶→加糖→搅拌。无论做珍珠奶茶还是芋泥奶茶,步骤框架不变,只是某些细节不同(比如加珍珠或芋泥)。模板方法模式就是这个“奶茶配方”——它定义算法的骨架,将某些步骤的实现延迟到子类,使得子类可以不改变算法结构,却能调整具体步骤。 为什么需要它? 代码复用:避免重复写相同流程的代码(比如文件读取的“打开→读取→关闭”)。 控制扩展点:父类控制整体流程,子类只实现差异化步骤。 减少冗余:多个子类共享同一套算法逻辑。 Java代码示例假设我们需要实现一个“字符...
设计模式笔记:Adapter模式
AI速览:适配器模式通过“转接头”机制(如对象适配器或类适配器)将一个类的接口转换为另一个接口,解决新旧系统或组件间的兼容问题(如USB-A转USB-C),核心是复用旧代码(如Banner类)而不修改其实现,客户端仅依赖目标接口(如Print),但可能增加代码层级。典型应用包括Java I/O适配器、Android列表数据绑定,本质是“接口翻译官”。 设计模式笔记:Adapter模式(适配器模式)什么是适配器模式?想象你有一个USB-C接口的电脑,但手头只有USB-A的U盘。这时你需要一个转接头,让旧设备能兼容新接口。适配器模式就是这个“转接头”——它将一个类的接口转换成另一个接口,使得原本不兼容的类可以协同工作。 为什么需要它? 解决接口不兼容:比如新旧系统对接时,无需修改已有代码。 复用遗留代码:将老旧功能包装成新接口供新系统使用。 灵活扩展:适配器可以同时兼容多个不同的类。 Java代码示例假设有一个已存在的Banner类(需要被适配),但客户端期望通过Print接口调用打印功能,用适配器模式实现兼容: 1. 被适配的类:Banner(已存在,但接口不兼...
设计模式:Iterator模式
AI速览:迭代器模式通过提供统一接口(如hasNext()和next())遍历集合元素,隐藏集合内部结构(如数组或链表),实现遍历与集合的解耦,常用于简化不同数据结构的访问逻辑(如Java集合框架),支持多种遍历方式,但可能增加简单场景的复杂度。核心思想是“无需关心集合细节,只管按需取用”。 设计模式:Iterator模式(迭代器模式)什么是迭代器模式?想象一下,你去图书馆借书,书架上摆满了不同类型的书籍。你不需要知道书架内部如何排列书籍,只需要问管理员“下一本是什么书?”就能依次拿到所有书。迭代器模式就是这个“管理员”——它帮你遍历集合对象中的元素,同时隐藏集合的内部结构(比如数组、链表),让遍历操作和集合本身解耦。 为什么需要它? 统一遍历方式:无论集合是数组、链表还是树,调用next()就能拿到下一个元素。 保护封装性:不需要暴露集合内部如何存储数据。 支持多种遍历:比如正序遍历、逆序遍历,甚至按条件过滤遍历。 Java代码示例假设我们有一个自定义的「书架」集合,存放多个「书」对象,用迭代器模式实现遍历: 1. 定义书对象(简单POJO)12345public c...
Docker Compose
Docker Compose什么是 Docker Compose?Docker Compose 是一个用于 定义和运行多容器 Docker 应用程序 的工具。 你可以将它想象成: 剧本 (YAML 文件 docker-compose.yml): 描述你的应用程序所需的“演员”(容器)以及它们之间的协作方式。 指挥家 (Docker Compose 工具): 读取剧本,指挥 Docker 创建、启动、停止和管理所有容器。 为什么需要 Docker Compose?在实际应用中,应用程序通常由多个容器组成,例如: Web 服务器 (Nginx, Apache) 应用服务器 (Python, Node.js, Java 应用) 数据库 (MySQL, PostgreSQL, MongoDB) 缓存 (Redis, Memcached) 消息队列 (RabbitMQ, Kafka) 手动管理这些容器会很繁琐且容易出错,需要记住启动顺序、网络配置、端口映射、卷挂载等。 Docker Compose 的出现就是为了简化多容器应用的编排和管理。 Docker Compose 的核心:d...
Docker 网络
Docker 网络本文将深入探讨 Docker 网络的核心概念、类型以及使用方法,帮助你掌握容器互联的奥秘。 一、为什么需要 Docker 网络? 默认情况下,Docker 容器是相互隔离的,它们拥有各自独立的网络命名空间,无法直接互相访问。但实际应用中,我们经常需要多个容器协同工作,例如 Web 应用容器需要访问数据库容器,或者多个微服务容器之间需要互相调用。 Docker 网络就是为了解决容器间通信的问题而诞生的。它允许你创建虚拟网络,并将容器连接到这些网络中,从而实现容器之间的互联互通。 二、Docker 网络的核心概念 网络 (Network): Docker 网络是容器之间通信的桥梁,它类似于物理网络中的交换机或路由器。你可以创建多个 Docker 网络,不同的网络之间默认是隔离的。 网络驱动 (Network Driver): 网络驱动负责实现 Docker 网络的具体功能。Docker 提供了多种内置网络驱动,每种驱动适用于不同的场景。 容器 (Container): 容器是 Docker 网络的基本单元。容器通过连接到 Docker 网络来与其他容器或外部网络进...
Docker 绑定挂载
绑定挂载的核心作用直接将宿主机的指定目录或文件映射到容器内部路径,实现以下目标: 实时同步:宿主机文件修改后,容器内立即生效。 持久化存储:容器删除后,宿主机目录数据保留。 灵活管理:无需重建镜像即可更新配置、代码或资源。 核心应用场景与示例1. 开发环境代码实时同步 场景:在开发过程中,频繁修改代码并需要容器内实时运行最新版本。 用法: 12# 将本地项目目录挂载到容器的代码工作目录docker run -v $(pwd)/src:/app/src -w /app/src my-dev-image npm start -v $(pwd)/src:/app/src:将当前目录下的 src 文件夹挂载到容器的 /app/src。 -w /app/src:设置容器的工作目录为挂载的代码路径。 效果:修改本地 src 中的代码后,容器内进程(如 npm start)自动加载最新代码。 2. 动态更新配置文件 场景:修改容器服务的配置文件(如 Nginx、MySQL、Redis 等),无需重启容器。 用法: 12# 挂载宿主机配置文件到容器内的默认配置路径dock...
Docker 数据卷挂载
Docker 数据卷挂载 数据卷(Volume)的概念 数据卷是一个虚拟目录,用于建立容器内目录与宿主机目录之间的映射关系。 作用:实现容器与宿主机之间的数据共享和持久化存储。 为什么需要数据卷? 持久化数据容器默认是临时(ephemeral)的,删除后内部数据丢失。数据卷可将数据存储在宿主机,避免丢失。 跨容器共享数据多个容器可挂载同一数据卷,实现数据共享(如微服务场景)。 开发便捷性绑定挂载支持实时同步宿主机的文件改动到容器内,提升开发效率。 数据卷的类型 类型 特点 适用场景 命名卷 用户自定义名称,通过 docker volume create 创建,易于管理。 生产环境、需要持久化的数据 匿名卷 由 Docker 自动生成随机名称,生命周期与容器绑定。 临时数据存储 绑定挂载 直接映射宿主机指定目录到容器,路径需手动指定。 开发调试、配置文件动态更新 常用命令 创建命名卷 1docker volume create my-volume 启动容器并挂载卷 挂载命名卷: 1docker run -v my-volume:/containe...
Linux防火墙操作
Linux 防火墙操作指南本文档基于 firewalld 服务整理常用防火墙操作命令及注意事项,适用于 CentOS/RHEL 等系统。 目录 基础操作 端口管理 注意事项 基础操作查看防火墙状态12systemctl status firewalld # 查看详细状态(运行状态、日志等)firewall-cmd --state # 快速查看防火墙是否运行 启动/停止防火墙12systemctl start firewalld # 立即启动防火墙systemctl stop firewalld # 立即停止防火墙 开机自启配置12systemctl disable firewalld # 永久关闭防火墙(禁止开机自启)systemctl enable firewalld # 启用开机自启(未提供,但建议补充) 端口管理开放/关闭端口12345# 开放 TCP 8080 端口(永久生效)firewall-cmd --zone=public --add-port=8080/tcp --permanen...
Linux权限管理
AI速览:这篇笔记详细介绍了 Linux 文件权限管理的基础知识和常用命令,并提供了丰富的示例,方便读者理解和实践。通过学习这篇笔记,可以掌握如何查看、修改文件权限,以及如何管理文件的所有者和所属组,设置文件权限掩码。 初识Linux权限管理前置需求: 拥有至少一台Linux虚拟机或云服务器皆可 具有一定的编程基础 了解Linux基础命令,会使用vim编辑文件 善于向AI求助的头脑 我会尽可能地让本篇文章的每一个步骤都具有可操作性,建议大家一起操作以保证印象更深刻。 准备工作首先,打开你的Linux系统虚拟机或云服务器,你应该能看到类似如下的页面: 找一个你心仪的位置,创建一个文件夹,这个文件夹内就是接下来的我们要操作的位置。 笔者比较懒,心仪的位置就决定在家目录了,文件夹就叫mydir。 创建目录mkdir(make directory): 1mkdir mydir 接着输入cd(change directory)切换到我们刚刚创建的文件夹里: 1cd mydir 使用touch,创建一些文件,我们将在这些文件中初探Linux的权限管理,我这里把它命名为a.txt...
Linux打包压缩命令
tar 是 Linux 系统中用于 打包、压缩、解压文件 的核心命令之一。它可以将多个文件或目录合并为一个归档文件(通常称为 .tar 文件),并支持通过不同的压缩算法进一步压缩(如 .tar.gz, .tar.bz2 等)。 基本语法1tar [选项] [文件名] [文件/目录...] 常用选项 选项 功能 -c 创建新的归档文件(Create) -x 解压归档文件(eXtract) -t 查看归档文件内容列表(Table of contents) -v 显示操作过程的详细信息(Verbose) -f 指定归档文件名(File) -z 使用 gzip 压缩(如 .tar.gz) -j 使用 bzip2 压缩(如 .tar.bz2) -J 使用 xz 压缩(如 .tar.xz) -C 解压到指定目录(Change directory) --exclude 排除指定文件/目录 常用场景示例1. 打包文件/目录1tar -cvf archive.tar file1.txt dir1/ -c: 创建归档文件 -...