0%

代理模式(Proxy Pattern):控制对象访问的中间层

代理模式是结构型设计模式的一种,核心思想是为目标对象提供一个代理对象,通过代理对象控制对目标对象的访问。代理模式在不修改目标对象的前提下,可对其功能进行扩展(如增强、限制、监控等),广泛应用于远程调用、权限控制、日志记录等场景。

代理模式的核心结构

代理模式

代理模式包含三个核心角色,通过分工实现对目标对象的访问控制:

  • 抽象角色(Subject)
    声明目标对象和代理对象的共同接口(或抽象类),确保代理对象可替代目标对象。
  • 真实角色(Real Subject)
    被代理的目标对象,负责实现核心业务逻辑。
  • 代理角色(Proxy)
    实现抽象角色,内部持有真实角色的引用,负责控制对真实角色的访问,并可在调用前后添加额外操作(如日志、权限校验)。

静态代理(Static Proxy)

静态代理是最简单的代理模式实现,代理类在编译期就已确定,与目标类实现相同的接口。

实现方式

  1. 定义抽象接口(抽象角色)。
  2. 真实角色实现接口,提供核心业务逻辑。
  3. 代理角色实现同一接口,内部持有真实角色的引用,在调用真实角色方法前后添加扩展逻辑。

代码示例

以 “服装工厂代理销售” 为例:

阅读全文 »

Docker 常见命令大全:从镜像管理到容器操作

Docker 命令是使用 Docker 的基础,涵盖镜像检索、容器管理、数据卷操作等核心功能。本文系统整理 Docker 常用命令,按功能分类并说明其用法和场景,帮助快速掌握 Docker 操作。

基础命令

1. 查看 Docker 版本

1
2
3
docker -v  # 简洁版本信息
#
docker version # 详细版本信息(包括客户端和服务端)

2. 帮助命令

1
2
docker --help  # 查看所有命令帮助
docker [command] --help # 查看特定命令帮助(如docker run --help)

3. 启动 / 停止 Docker 服务

1
2
3
4
5
6
7
8
9
10
11
# 启动Docker(Linux)
sudo systemctl start docker

# 停止Docker(Linux)
sudo systemctl stop docker

# 重启Docker(Linux)
sudo systemctl restart docker

# 查看Docker状态(Linux)
sudo systemctl status docker

镜像命令

镜像是 Docker 的核心组件,以下命令用于镜像的检索、下载、管理等操作。

1. 检索镜像

从 Docker Hub 搜索镜像:

阅读全文 »

Feign 的编解码器:请求与响应的处理机制

Feign 作为声明式 HTTP 客户端,其核心能力之一是自动处理请求参数的编码和响应结果的解码。编解码器(Encoder/Decoder)是 Feign 实现这一功能的关键组件,负责在服务调用过程中完成数据格式的转换。

编码器(Encoder):请求参数的序列化

编码器的作用是将 Java 对象转换为 HTTP 请求体(如 JSON、表单数据等),以便服务端能够正确解析。Feign 默认提供了多种编码器,也支持自定义实现。

1. 内置编码器

  • SpringEncoder:Spring Cloud 整合后默认使用的编码器,基于 Spring 的HttpMessageConverter实现,支持 JSON、XML 等多种格式(依赖jackson-databind等库)。
  • FormEncoder:用于处理表单提交(application/x-www-form-urlencoded),需单独引入feign-form依赖。

2. 自定义编码器实现

当默认编码器无法满足需求(如特殊数据格式、加密处理)时,可通过实现Encoder接口自定义:

阅读全文 »

适配器模式(Adapter Pattern):接口转换的桥梁

适配器模式是结构型设计模式的一种,核心思想是将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协同工作的类能够一起工作。它就像生活中的 “转换插头”,让不同规格的设备可以互通,核心功能是 “转换匹配,复用已有功能”。

适配器模式的核心结构

适配器模式

适配器模式包含三个核心角色,通过转换实现接口兼容:

目标角色(Target)

  • 客户端期望的目标接口,定义了客户端需要的方法。
  • 示例:USB接口(客户端设备需要的接口)。

被适配角色(Adaptee)

  • 已存在的旧接口,其功能需要被复用,但与目标接口不兼容。
  • 示例:Type-C接口(已有设备的接口,与 USB 不兼容)。

适配器角色(Adapter)

  • 实现目标接口,并包装被适配对象,将目标接口的方法转换为被适配接口的方法调用。
  • 示例:USB-TypeC转换器(实现 USB 接口,内部调用 Type-C 设备的功能)。

适配器模式的两种实现方式

根据适配器与被适配对象的关系(继承 / 组合),适配器模式分为类适配器对象适配器

阅读全文 »

装饰器模式(Decorator Pattern):动态扩展对象功能的灵活方式

装饰器模式是结构型设计模式的一种,核心思想是动态地给对象添加额外职责或功能,而无需修改原对象的结构。它通过 “包装”(组合)而非 “继承” 实现扩展,比生成子类更灵活,本质是 “动态组合”。

装饰器模式的核心结构

装饰模式

装饰器模式通过四个角色实现功能的动态扩展,层次清晰且职责明确:

组件接口(Component)

  • 定义对象的核心功能接口,是装饰器和具体组件的共同父类。
  • 示例:InputStream(Java IO 中的输入流接口,定义读取数据的核心方法)。

具体组件(ConcreteComponent)

  • 实现组件接口,是被装饰的原始对象,提供基础功能。
  • 示例:FileInputStream(具体的文件输入流,实现基础的文件读取)。

装饰器抽象类(Decorator)

  • 实现组件接口,并持有一个组件对象的引用(通过构造方法注入),定义所有装饰器的统一接口。
  • 示例:FilterInputStream(Java IO 中的装饰器抽象类,持有InputStream引用)。

具体装饰器(ConcreteDecorator)

  • 继承装饰器抽象类,添加额外功能,在调用被装饰对象的方法前后插入新逻辑。
  • 示例:BufferedInputStream(为输入流添加缓冲功能)、DataInputStream(添加数据类型转换功能)。

代码实现示例

以 “咖啡订单系统” 为例:基础咖啡(如美式咖啡)可通过装饰器动态添加牛奶、糖等配料,实现功能扩展。

阅读全文 »