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

代理模式和适配器模式有什么区别

代理模式(Proxy Pattern)和适配器模式(Adapter Pattern)是两种结构型设计模式,它们看似相似,但在设计意图、使用场景以及功能上有一些显著的区别。下面是它们的主要区别:

1. 目的与意图

  • 代理模式(Proxy Pattern):代理模式的主要目的是控制对某个对象的访问。代理对象充当“中介”,在客户端和目标对象之间进行某种程度的控制。代理可以增加额外的功能,如延迟加载、安全控制、日志记录等。代理对象与目标对象通常有相同的接口,因此可以在客户端不感知的情况下替代目标对象。

    常见场景

    • 虚拟代理:延迟加载大型对象或资源。
    • 远程代理:客户端和目标对象分布在不同的地址空间。
    • 安全代理:控制对目标对象的访问,进行权限验证。
    • 智能代理:在访问目标对象时,附加一些额外的功能,如记录访问次数。
  • 适配器模式(Adapter Pattern):适配器模式的目的是让两个不兼容的接口可以协同工作。适配器通过将一个接口转换成客户端所期望的接口,从而使得不兼容的类能够一起工作。适配器通常用于解决接口不匹配的问题,尤其是在已有的类库或系统之间。

    常见场景

    • 将不同系统中的接口统一,以便系统间能够互操作。
    • 改变现有类的接口,以使其能够与其他类兼容。

2. 结构

  • 代理模式

    • 代理对象和目标对象实现相同的接口。
    • 代理对象通过将请求转发到目标对象,或在请求前后做额外处理。
    • 客户端 → 代理对象 (Proxy) → 目标对象 (RealSubject)
  • 适配器模式

    • 适配器对象实现目标接口,适配并转化客户端要求的接口与被适配类的接口之间的差异
    • 客户端 → 适配器对象 (Adapter) → 被适配对象 (Adaptee)

3. 功能和应用

  • 代理模式:代理模式的核心是“控制访问”。

    • 代理对象可以控制对目标对象的访问,如权限控制、延迟加载、缓存等。
    • 代理和目标对象通常是相同的类型(即它们都实现了同样的接口)。

    示例:远程代理(如在分布式系统中,代理类用于远程调用目标对象)或虚拟代理(用于延迟加载某些计算量大或数据量大的对象)。

  • 适配器模式:适配器模式的核心是“转换接口”。

    • 适配器对象将目标对象的接口转化成客户端能够理解的接口。
    • 适配器和目标对象的类型不一定相同,适配器充当“桥梁”,使得两个不兼容的接口能够互操作。

    示例:将旧的接口适配到新的接口,或者将一个类的接口适配为另一个类的接口。

4. 责任范围

  • 代理模式:代理模式的责任是控制和管理对真实对象的访问,可以实现控制、优化和额外的行为。
  • 适配器模式:适配器的责任是转换接口,确保不同接口之间可以无缝连接,保证协作的顺利进行。

5. 总结

特性代理模式 (Proxy)适配器模式 (Adapter)
主要目的是控制对目标对象的访问使不兼容的接口能够协同工作
结构代理对象与目标对象有相同的接口适配器将一个接口转换成另一个接口
职责控制访问、延迟加载、安全、日志等解决接口不兼容的问题,进行接口转换
示例场景延迟加载、远程代理、安全代理等解决类库或系统之间接口不兼容的问题
  • 代理模式主要关注控制访问,它通过在客户端和目标对象之间增加一个代理对象,从而对目标对象进行控制。
  • 适配器模式主要关注接口转换,它通过适配器将不兼容的接口转化为客户端所期望的接口,允许不兼容的对象互操作。
http://www.lryc.cn/news/514920.html

相关文章:

  • 2025年度全国会计专业技术资格考试 (甘肃考区)报名公告
  • ansible-playbook 搭建JDK
  • 数据结构(ing)
  • 杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装
  • webpack5基础(上篇)
  • 快速理解MIMO技术
  • 【RTD MCAL 篇3】 K312 MCU时钟系统配置
  • 探索Docker Compose:轻松管理多容器应用
  • 计算机网络 (18)使用广播信道的数据链路层
  • 【vLLM 学习】欢迎来到 vLLM!
  • 现代网络基础设施中的 TCP 握手之下
  • GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)
  • NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)
  • 中药和西药的区别
  • Spring Security(maven项目) 3.0.2.4版本
  • 【Ubuntu】安装华为的MindSpore
  • 【模型】Qwen2-VL 服务端UI
  • 计算机网络•自顶向下方法:网络层介绍、路由器的组成
  • 安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
  • 多个线程处理不同的数据,等线程都完成后再进行下一步操作
  • 聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载
  • Rust 基础入门指南
  • 青少年编程与数学 02-006 前端开发框架VUE 03课题、编写APP组件
  • 基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】
  • linux-26 文件管理(四)install
  • VS2015中使用boost库函数时报错问题解决error C4996 ‘std::_Copy_impl‘
  • pikachu靶场--目录遍历和敏感信息泄露
  • 植物大战僵尸杂交版3.0.2版本
  • kafka怎么保证顺序消费?
  • Makefile 模板 --- 内核模块