0%

建造者模式(Builder Pattern):复杂对象的分步构建艺术

建造者模式(又称生成器模式)是创建型设计模式的一种,核心思想是将复杂对象的构建过程与表示分离,使得同样的构建流程可以生成不同的产品表示。这种模式特别适合处理由多个部件组成、构建步骤复杂的对象(如汽车、文档、配置项等)。

建造者模式的核心结构

构建器模式

建造者模式通过四个核心角色实现复杂对象的构建,分工明确且各司其职:

产品(Product)

  • 定义被构建的复杂对象,包含多个组成部件(如汽车的发动机、底盘、车身等)。
  • 示例:Computer(包含 CPU、内存、硬盘等部件)。

建造者接口(Builder)

  • 声明构建产品各个部件的抽象方法(如buildCPU()buildMemory()),以及返回最终产品的方法(如getResult())。
  • 作用:规范构建流程,确保所有具体建造者遵循统一的步骤。

具体建造者(ConcreteBuilder)

  • 实现建造者接口,具体实现每个部件的构建逻辑,并负责将部件组装成产品。
  • 示例:GameComputerBuilder(构建游戏电脑,侧重高性能 CPU 和显卡)、OfficeComputerBuilder(构建办公电脑,侧重稳定性)。

指导者(Director)

  • 负责控制构建流程,调用建造者接口的方法按顺序构建产品,不直接参与部件的具体构建。
  • 作用:隔离客户端与构建过程,确保构建步骤的一致性。

代码实现示例

以 “自定义电脑组装” 为例,展示建造者模式的具体应用:

阅读全文 »

模板方法模式(Template Method Pattern):固定算法骨架,灵活定制步骤

模板方法模式是行为型设计模式的一种,核心思想是在抽象类中定义一个算法的骨架(模板方法),将算法中可变的步骤延迟到子类中实现,使得子类在不改变算法整体结构的前提下,可自定义某些特定步骤。这种模式就像 “文档模板”—— 模板规定了文档的整体结构(如标题、正文、结尾),用户只需填充具体内容即可,核心是 “固定骨架,灵活填充”。

模板方法模式的核心结构

模板方法模式

模板方法模式通过抽象类和子类的配合实现算法的复用与扩展,包含三种关键方法:

模板方法(Template Method)

  • 定义在抽象类中,描述算法的骨架,按顺序调用其他方法(抽象方法、钩子方法),构成完整的算法流程。
  • 通常用final修饰,防止子类修改算法结构。
  • 示例:makeBeverage()(制作饮料的模板方法,依次调用 “煮水→冲泡→倒杯→加配料”)。

抽象方法(Abstract Method)

  • 由抽象类声明、子类必须实现的方法,对应算法中可变的步骤。
  • 示例:brew()(冲泡,咖啡和茶的冲泡方式不同)、addCondiments()(加配料,咖啡加奶,茶加糖)。

钩子方法(Hook Method)

  • 由抽象类声明并提供默认实现(可为空),子类可选择重写,用于控制算法流程或添加额外逻辑。
  • 示例:isAddCondiments()(是否加配料,子类可通过返回false跳过该步骤)。

代码实现示例

以 “饮料制作流程” 为例,展示模板方法模式的实现:咖啡和茶的制作流程基本相同(煮水→冲泡→倒杯→加配料),但冲泡方式和配料不同,通过模板方法固定流程,子类实现差异步骤。

阅读全文 »

Spring Boot Runner 详解:ApplicationRunner 与 CommandLineRunner 实战指南

在 Spring Boot 应用中,若需在 SpringApplication.run() 启动完成后自动执行初始化逻辑(如加载配置、初始化缓存、校验依赖服务),可通过 ApplicationRunnerCommandLineRunner 接口实现。这两个接口均为 Spring Boot 提供的 “启动后回调” 扩展点,核心作用是在 Spring 上下文初始化完成后、应用对外提供服务前执行自定义逻辑。从 “接口差异→实现方式→执行顺序→实战场景” 四个维度,系统讲解 Runner 的使用方法与底层原理。

Runner 接口核心作用与差异

ApplicationRunnerCommandLineRunner 功能高度相似,均用于 “启动后执行逻辑”,但在参数接收方式上存在关键差异,适用于不同场景。

1. 接口定义对比

(1)ApplicationRunner 接口
1
2
3
4
5
6
7
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;

public interface ApplicationRunner {
// 参数为 ApplicationArguments 对象,支持解析命令行参数(含选项参数和非选项参数)
void run(ApplicationArguments args) throws Exception;
}
(2)CommandLineRunner 接口
1
2
3
4
5
6
import org.springframework.boot.CommandLineRunner;

public interface CommandLineRunner {
// 参数为 String 数组,直接接收原始命令行参数(不解析,按输入顺序存储)
void run(String... args) throws Exception;
}

2. 核心差异:参数处理方式

阅读全文 »

SSL 协议:网络通信的安全基石

SSL(Secure Sockets Layer,安全套接字协议)是一种位于 TCP/IP 协议栈中传输层与应用层之间的安全协议,其核心作用是通过加密、认证和完整性校验,为上层应用(如 HTTP、SMTP、FTP)提供安全的通信通道,防止数据在传输过程中被窃听、篡改或伪造。尽管 SSL 已被 TLS(Transport Layer Security)取代,但其设计理念和核心机制仍是现代网络安全的基础。

SSL 协议的核心目标

SSL 协议通过三层防护机制,实现网络通信的 “机密性、真实性、完整性”:

  1. 机密性:通过加密算法对传输数据进行加密,确保只有通信双方能解密读取。
  2. 真实性:通过数字证书验证通信双方的身份(尤其是服务器身份),防止中间人冒充。
  3. 完整性:通过消息认证码(MAC)检测数据是否在传输中被篡改。

SSL 协议的分层结构

SSL 协议采用分层设计,分为记录协议握手协议两大部分,每层专注于不同的安全功能:

1. SSL 记录协议(Record Protocol)

  • 作用:位于最底层,负责对上层协议(如握手协议、应用数据)的数据进行分段、压缩、加密和校验,是所有 SSL 数据传输的基础。
  • 工作流程:
    1. 接收上层数据(如握手消息、HTTP 请求),将其分割为最大 2^14 字节的块。
    2. 可选压缩(现代 SSL/TLS 中较少使用,避免压缩侧信道攻击)。
    3. 计算消息认证码(MAC),用于完整性校验。
    4. 使用对称加密算法(如 AES)对数据和 MAC 进行加密。
    5. 添加 SSL 记录首部(包含版本、长度等信息),通过 TCP 发送。
  • 核心算法:对称加密(AES、3DES)、哈希算法(SHA-256,用于 MAC 计算)。

2. SSL 握手协议(Handshake Protocol)

  • 作用:位于记录协议之上,是 SSL 协议中最复杂的部分,负责在通信前完成算法协商、密钥交换和身份认证,为后续加密通信奠定基础。
  • 握手流程(简化版):
    1. 客户端问候(Client Hello):客户端向服务器发送支持的 SSL 版本、加密套件(如TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)、随机数(Client Random)。
    2. 服务器问候(Server Hello):服务器回应选择的 SSL 版本、加密套件、随机数(Server Random),并发送服务器数字证书。
    3. 客户端验证服务器:客户端验证服务器证书的有效性(检查颁发机构、有效期、是否被吊销),确认服务器身份。
    4. 密钥交换:
      • 若使用非对称加密(如 RSA):客户端生成 “预主密钥(Pre-Master Secret)”,用服务器公钥加密后发送给服务器。
      • 若使用密钥协商算法(如 ECDHE):双方交换公钥参数,各自计算出相同的预主密钥(更安全,支持前向 secrecy)。
    5. 生成会话密钥:客户端和服务器分别用 Client Random、Server Random 和 Pre-Master Secret,通过相同算法生成主密钥(Master Secret),再派生出用于加密和 MAC 的会话密钥。
    6. 握手完成:双方发送 “完成消息”(用会话密钥加密),确认握手成功,后续通信使用会话密钥加密。
阅读全文 »

浏览器内核详解

浏览器内核(Rendering Engine)是浏览器的核心组件,负责解析网页内容(HTML、CSS、JavaScript 等)并将其渲染为可视化页面。不同浏览器采用不同的内核,这也是导致网页在不同浏览器中可能呈现差异的主要原因之一。

主流浏览器及其内核

目前主流浏览器所使用的内核如下:

  • Microsoft Edge(新版):自 2019 年起,新版 Edge 放弃了原有的 EdgeHTML 内核,转而采用Blink 内核(基于 Chromium 项目),与 Chrome 保持一致。
  • Google Chrome、Opera:使用Blink 内核(Blink 是 WebKit 的分支,由 Google 主导开发)。
  • Mozilla Firefox:使用Gecko 内核,这是 Firefox 一直以来坚持使用的自主研发内核。
  • Apple Safari:使用WebKit 内核,该内核在苹果生态(如 macOS、iOS)中广泛应用。

浏览器内核发展时间线及演变

浏览器内核的发展经历了多个阶段,诞生顺序及演变关系如下:

阅读全文 »