23种设计模式-结构型模式-代理

文章目录

  • 简介
  • 问题
  • 解决方案
  • 代码
    • 核心设计要点
  • 总结

简介

代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在把请求提交给对象前后进行一些处理。

问题

为什么要控制对于某个对象的访问呢?举个例子:有一个消耗大量系统资源的巨型对象,你只是偶尔需要使用它。
在这里插入图片描述

如上图,数据库连接的初始化和查询可能会非常缓慢,我们可以先实现延迟初始化,只在实际有需要时再创建这个对象。这样对象的所有客户端都要执行延迟初始代码。这很可能会带来很多重复代码。在理想情况下,我们希望把延迟初始化的代码直接放入这个对象的类里,但这并不一定能实现, 因为这个类可能是第三方封闭库的一部分。

解决方案

代理模式建议 新建一个和原来的服务对象接口相同的代理类,然后把代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象,并把所有工作委派给它。

在这里插入图片描述
如上图,代理把自己伪装成数据库对象,可以在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。
这有什么好处呢?如果需要在类的主要业务逻辑前后执行一些工作,你不需要修改原始类就能完成这个工作。而且由于代理实现的接口与原类相同,因此你可以在任何一个使用实际服务对象的客户端中使用它。

代码

// 服务接口
interface Database {String executeQuery(String sql);
}// 真实服务对象
class RealDatabase implements Database {public RealDatabase() {initializeConnection(); // 耗时的连接初始化}private void initializeConnection() {System.out.println("正在建立数据库连接...");}@Overridepublic String executeQuery(String sql) {System.out.println("执行真实查询: " + sql);return "结果数据"; // 示例返回值}
}// 代理类(延迟加载和缓存)
class DatabaseProxy implements Database {private RealDatabase realDatabase; private Map<String, String> cache = new HashMap<>(); // 查询结果缓存@Overridepublic String executeQuery(String sql) {// 延迟初始化(虚拟代理模式)if (realDatabase == null) {realDatabase = new RealDatabase(); }// 结果缓存逻辑(缓存代理)if (cache.containsKey(sql)) {System.out.println("[Proxy] 返回缓存结果: " + sql);return cache.get(sql);}String result = realDatabase.executeQuery(sql);cache.put(sql, result);return result;}
}// 客户端交互
class Application {public static void main(String[] args) {Database proxy = new DatabaseProxy();// 第一次查询触发真实连接System.out.println(proxy.executeQuery("SELECT * FROM users"));// 重复查询使用缓存System.out.println(proxy.executeQuery("SELECT * FROM users"));// 新查询继续代理System.out.println(proxy.executeQuery("SELECT COUNT(*) FROM products"));}
}

核心设计要点

  1. 代理类与现实服务实现相同接口
  2. 第一次查询延迟初始化真实连接(虚拟代理模式)
  3. 哈希表缓存重复查询结果(缓存优化)
  4. 客户端代码不需感知代理存在(透明访问)

总结

在这里插入图片描述

  1. 服务接口(Ser­vice Inter­face):声明接口,代理必须遵循这个接口才能伪装成服务对象。
  2. 服务(Ser­vice)类提供了一些实用的业务逻辑。
  3. 代理(Proxy)类包含一个指向服务对象的引用成员变量。代理完成他的任务之后,(比如延迟初始化、记录日志、访问控制和缓存等),会把请求传递给服务对象。通常情况下,代理会对这个服务对象的整个生命周期进行管理。
  4. 客户端(Client)能通过同一接口跟服务或代理进行交互,所以你可在一切需要服务对象的代码中使用代理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Transformer框架实现微调后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微调完具备思维链的DeepSeek模型之后(详见《深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题》),接下来就需要针对微调好的模型或者是原始模型(注意需要有一个本地的模型文件,全量微调就是saves下面的文件夹,如果是LoRA,…

基于OpenCV的指纹验证:从原理到实战的深度解析

指纹识别的技术革命与OpenCV的轻量级方案 在生物特征识别领域&#xff0c;指纹识别始终以独特性和稳定性占据核心地位。随着OpenCV等开源视觉库的普及&#xff0c;这项看似"高大上"的技术正逐步走向民用化开发。本文将突破传统算法框架&#xff0c;提出一套基于OpenC…

十五届蓝桥杯省赛Java B组(持续更新..)

目录 十五届蓝桥杯省赛Java B组第一题&#xff1a;报数第二题&#xff1a;类斐波那契数第三题&#xff1a;分布式队列第四题&#xff1a;食堂第五题&#xff1a;最优分组第六题&#xff1a;星际旅行第七题&#xff1a;LITS游戏第八题&#xff1a;拼十字 十五届蓝桥杯省赛Java B…

多模态学习(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目录 一.摘要 1.1 摘要翻译 1.2 摘要解析 二.Introduction 2.1 Introduciton翻译 2.2 Introduction 解析 三. related work 3.1 related work翻译 3.2 relate work解析 四…

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…

AF3 OpenFoldDataset类looped_samples方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataset 类的 looped_samples 方法用于 循环采样数据,确保数据能被不断地提供,适用于 PyTorch 的 DataLoader 在训练过程中迭代读取数据。dataset_idx 指定了当前要处理的数据集(即 self.datasets[dataset_idx]) 源代码: def loo…

lua表table和JSON字符串互转

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 与 string 转换 local function value2string(value, isA…

请谈谈分治算法,如何应用分治算法解决大规模问题?

分治算法实战解析与前端应用指南 分治算法本质剖析 分治算法的核心在于"分而治之"&#xff0c;其工作流程可分解为三个关键阶段&#xff1a; 分解阶段&#xff08;Divide&#xff09;&#xff1a;将复杂问题拆分为若干个相互独立的子问题攻克阶段&#xff08;Conqu…

基于BusyBox构建ISO镜像

1. 准备 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建议&#xff1a;系统内核<3.10.0 使用busybox < 1.33.2版本 2. 安装busybox # 安装依赖 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下载 wget https://…

Node.js 与 MySQL:深入理解与高效实践

Node.js 与 MySQL:深入理解与高效实践 引言 随着互联网技术的飞速发展,Node.js 作为一种高性能的服务端JavaScript运行环境,因其轻量级、单线程和事件驱动等特点,受到了广大开发者的青睐。MySQL 作为一款开源的关系型数据库管理系统,以其稳定性和可靠性著称。本文将深入…

Android学习总结之handler源码级

一、核心类关系与线程绑定&#xff08;ThreadLocal 的核心作用&#xff09; 1. Looper 与 ThreadLocal 的绑定 每个线程的 Looper 实例通过 ThreadLocal<Looper> sThreadLocal 存储&#xff0c;确保线程隔离&#xff1a; public final class Looper {// 线程本地存储&…

群体智能优化算法-算术优化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代码)

摘要 算术优化算法&#xff08;Arithmetic Optimization Algorithm, AOA&#xff09;是一种新颖的群体智能优化算法&#xff0c;灵感来源于加、减、乘、除四种基本算术运算。在优化过程中&#xff0c;AOA 通过乘除操作实现全局探索&#xff0c;通过加减操作强化局部开发&#…

广告推荐算法:COSMO算法与A9算法的对比

COSMO算法与A9算法的概念解析 1. A9算法 定义与背景&#xff1a; A9算法是亚马逊早期为电商平台研发的核心搜索算法&#xff0c;主要用于优化商品搜索结果的排序和推荐&#xff0c;其核心逻辑围绕产品属性与关键词匹配展开。自2003年推出以来&#xff0c;A9通过分析商品标题…

EasyExcel 数据字典转换器实战:注解驱动设计

一、场景痛点与解决方案 1. 问题背景 在 Excel 导入导出场景中&#xff0c;开发者常面临以下问题&#xff1a; 数据可读性差&#xff1a;数据库存储的字典值&#xff08;如 1、true&#xff09;直接导出时难以理解双向转换复杂&#xff1a;导入时需将用户输入的标签反向解析…

五种音频器件综合对比——《器件手册--音频器件》

目录 音频器件 简述 1. 扬声器&#xff08;Speakers&#xff09; 2. 麦克风&#xff08;Microphones&#xff09; 3. 放大器&#xff08;Amplifiers&#xff09; 4. 音频接口&#xff08;Audio Interfaces&#xff09; 5. 音频处理器&#xff08;Audio Processors&#xff09…

红宝书第二十九讲:详解编辑器和IDE:VS Code与WebStorm

红宝书第二十九讲&#xff1a;详解编辑器和IDE&#xff1a;VS Code与WebStorm 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、核心区别&#xff1a;编辑器与IDE 代码编辑器&#xff08;如VS Code&#xff09…

虚拟电商-话费充值业务(五)充值成功逻辑和网络异常重试逻辑

一、网络异常重试逻辑编写 如果在对接供应商的过程中出现了网络异常&#xff0c;我们需要做一个补偿机制&#xff0c;在任务类型枚举类&#xff1a;TaskTypeEnum中有一种业务状态码是针对远程调用失败的 步骤一&#xff1a;在对接供应商的方法&#xff1a;SupplierServiceImp…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.3低代码开发:快速构建行业应用(电商推荐与金融风控案例)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第四部分:工程实践与部署4.3.3 低代码开发:快速构建行业应用(电商推荐与金融风控案例)1. 低代码与AI结合的核心价值2. 电商推荐系统案例2.1 技术架构与实现2.2 性能…

Table as Thought论文精读

标题&#xff1a;Table as Thought: Exploring Structured Thoughts in LLM Reasoning 作者&#xff1a;Zhenjie Sun, Naihao Deng, Haofei Yu, Jiaxuan You 单位&#xff1a;University of Illinois Urbana-Champaign, University of Michigan 摘要&#xff1a; llm的推理…

ubuntu18 server版花屏问题

新搞了一台dellT150的塔式服务器&#xff0c;装的ubuntu18 server版。 开机后遇到花屏&#xff0c;或者卡在开机界面的问题&#xff0c;和售后技术沟通这个情况是ubuntu自带的显卡驱动包兼容问题。需要做如下设置&#xff1a; 解决&#xff1a; 1.开机&#xff0c;连续按下e…