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

GO设计模式——14、代理模式(结构型)

目录

代理模式(Proxy Pattern)

代理模式的核心角色:

优缺点

使用场景

注意事项

代码实现


代理模式(Proxy Pattern)

        代理模式(Proxy Pattern)通过引入代理对象来控制对真实对象的访问。

代理模式的核心角色

  • 抽象主题(Subject):定义了真实对象和代理对象的共同接口,这样在任何使用真实对象的地方都可以使用代理对象。
  • 真实主题(Real Subject):定义了代理对象所代表的真实对象。
  • 代理(Proxy):保存一个引用使得代理可以访问真实主题,并提供与真实主题相同的接口,以便可以在任何时候替代真实主题。

优缺点

(1)优点:

  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 代理对象可以扩展目标对象的功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

(2)缺点:

  • 代理模式会造成系统设计中类的数量增加
  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度;

使用场景

        按职责来划分,通常有以下使用场景:(1)远程代理。 (2)虚拟代理。 (3)Copy-on-Write 代理。 (4)保护(Protect or Access)代理。(5)Cache代理。(6)防火墙(Firewall)代理。 (7)同步化(Synchronization)代理。 (8)智能引用(Smart Reference)代理。

注意事项

  • 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
  • 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

代码实现

package mainimport "fmt"// 文件下载器,用户可以通过下载器下载文件。为了提高下载速度和安全性,
// 希望引入一个代理对象,代理对象可以在下载前进行权限验证,并记录下载日志。// 抽象主题:文件接口
type File interface {Download()
}// 真实主题:具体文件
type RealFile struct {filename string
}func (f *RealFile) Download() {fmt.Printf("Downloading file: %s\n", f.filename)
}// 代理:文件代理
type FileProxy struct {realFile *RealFile
}func (p *FileProxy) Download() {p.authenticate()p.realFile.Download()p.log()
}func (p *FileProxy) authenticate() {fmt.Println("Authenticating user...")
}func (p *FileProxy) log() {fmt.Println("Logging download activity...")
}// 客户端代码
func main() {file := &FileProxy{realFile: &RealFile{filename: "example.txt",},}file.Download()
}

相关文章:

GO设计模式——14、代理模式(结构型)

目录 代理模式(Proxy Pattern) 代理模式的核心角色: 优缺点 使用场景 注意事项 代码实现 代理模式(Proxy Pattern) 代理模式(Proxy Pattern)通过引入代理对象来控制对真实对象的访问。 代…...

外贸SOHO建站怎么做?海洋建站方法策略?

外贸SOHO建站多少钱?外贸自助建站系统有哪些? 随着全球化的加速发展,外贸SOHO已经成为越来越多创业者的选择。然而,要想在竞争激烈的外贸市场中脱颖而出,一个专业的外贸网站是必不可少的。接下来海洋建站将探讨外贸SO…...

商城免费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

鸿鹄云商 SAAS云产品概述 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、My…...

【淘宝网消费类电子产品销售数据可视化】

淘宝网消费类电子产品销售数据可视化 引言数据爬取与处理数据可视化系统功能1. 总数据量分析2. 店铺总数据3. 店铺销售额排名4. 不同电子商品销售价格5. 单个商品价格排名6. 不同省份平均销量7. 不同地区的平均销售额8. 省份数量9. 每个省份有用的平均个数 创新点结语 引言 随…...

AI编译器及TVM概述

AI编译器 AI编译器有许多不同的类型和品牌,以下是一些常见的AI编译器: TensorFlow:谷歌开发的深度学习框架,它包含了一个用于优化和编译TensorFlow模型的编译器。 PyTorch:一个基于Python的开源深度学习框架&#xf…...

排序-归并排序与计数排序

文章目录 一、归并排序1、概念2、过程3、代码实现4、复杂度5、稳定性 二、 计数排序1、思路2、代码实现3、复杂度:4、稳定性 一、归并排序 1、概念 是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已…...

国产数据库适配-人大金仓(kingbase V8R3)

金仓数据库是基于POSTGRE_SQL 参考资料 国产数据库人大金仓踩坑记录和函数适配_金仓数据库关系不存在-CSDN博客 Springboot工程 适配人大金仓 kingbase V8R3 引入驱动包和方言包 hibernate-5.2.17.Finaldialect.jar kingbase8-8.2.0.jar application.yml文件 driver-cla…...

HAAS 哈斯机床 读写刀补数据

哈斯机床不管是串口机床还是网口机床 都提供了Q命令 可以使用Q命令 进行刀具补偿的读取和写入 最多支持200把刀的 读取和写入...

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目

下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…...

BUUCTF crypto做题记录(4)新手向

目录 一、大帝的密码武器 二、Windows系统密码 三、信息化时代的步伐 四、凯撒?替换?呵呵! 一、大帝的密码武器 下载的文件叫zip,应该是提示文件的后缀名是zip,把名字改成1.zip或者其他也行,主要保证后缀名是zip就…...

【ArcGIS微课1000例】0080:ArcGIS将shp转json(geojson)案例教程

本文以案例的形式,讲述在ArcGIS软件中,将矢量数据转为GeoJSON的方法。 扩展阅读:【GIS风暴】GeoJSON数据格式案例全解 文章目录 一、GeoJson简介二、ArcGIS将矢量数据转为GeoJSON一、GeoJson简介 GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以…...

阿里云Centos8安装Dockers详细过程

一、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…...

leetcode 二数之和 三数之和 四数之和

leetcode 二数之和 三数之和 四数之和 又到了不想写博客的环节,不想归不想,有些事情还是要做的,今天总结的是多数之和的问题。 二数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target …...

制衣厂生产ERP系统怎么样?制衣厂生产ERP软件哪个好

有很多的制衣厂在订单处理、物料、仓储、销售、仓储、物料编码、车间成本核算、计件工资核算等方面还存在不少改进空间。 而经过多年的发展,现如今制衣行业的竞争比较激烈,如何提升各业务部门协同效率,减少车间物料损耗,简化生产…...

安装 DevEco Studio 后不能用本地 Node.js 打开

安装 DevEco Studio 后第一次打开时,不能用本地 Node.js 打开 答:因为本地 Node.js 文件夹名字中有空格 Node.js路径只能包含字母、数字、“。”、“_”、“-”、“:”和“V” 解决方法: 1.修改文件夹名称 2.重新下载 注意:找一…...

AppLink+WMS,实现仓储管理一体化

WMS像全能的库管员,可以在线还原真实仓库,让企业进行科学化、条理化、俯视化的仓库管理。 随着移动互联网和物流行业的快速发展,如何提高仓储管理的效率和准确性成为了企业关注的焦点。在这个背景下,结合AppLink和WMS系统&#x…...

如果是你,你选SOHO还是跟单?

昨天看到有人在讨论外贸跟单和外贸业务,谁的压力更大的问题?她们讨论的这个问题,源于一个年近四十准备二胎的宝妈,她做跟单十来年了,最近失业迷茫中,在纠结是否要SOHO?作为一个在工贸一体工厂做…...

大语言模型--能力

能力 大语言模型 能力从语言模型到任务模型的转化语言建模总结 从语言模型到任务模型的转化 在自然语言处理的世界中,语言模型 p p p是一种对代币序列 x 1 : L x_{1:L} x1:L​这样的模型能够用于评估序列,例如 p ( t h e , m o u s e , a t e , t h e ,…...

安装LLaMA-Factory微调chatglm3,修改自我认知

安装git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda activate llama_factory cd LLaMA-Factory pip install -r requirements.txt 之后运行 单卡训练, CUDA_VISIBLE_DEVICES0 python src/train_web.py…...

以太网协议与DNS

以太网协议 以太网协议DNS 以太网协议 以太网用于在计算机和其他网络设备之间传输数据,以太网既包含了数据链路层的内容,也包含了物理层的内容. 以太网数据报: 其中目的IP和源IP不是网络层的目的IP和源IP,而是mac地址.网络层的主要负责是整体的转发过程,数据链路层负责的是局…...

Spring Boot的日志

打印日志 打印日志的步骤: • 在程序中得到日志对象. • 使用日志对象输出要打印的内容 在程序中得到日志对象 在程序中获取日志对象需要使用日志工厂LoggerFactory,代码如下: package com.example.demo;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public c…...

Cisco Packet Tracer配置命令——交换机篇

交换机VLAN配置 在简单的网络环境中,当交换机配置完端口后,即可直接应用,但若在复杂或规模较大的网络环境中,一般还要进行VLAN的规划,因此在交换机上还需进行 VLAN 的配置。交换机的VLAN配置工作主要有VLAN的建立与删…...

python单例模式

设计模式:单例模式(Singleton Pattern)。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。 class Singleton:_instance Nonedef __new__(cls):if cls._instance is None:cls._instance super().__new__(cl…...

环境保护:人类生存的最后机会

随着科技的进步和人类文明的不断发展,地球上的自然资源也在以惊人的速度消耗殆尽。人类对于环境的无止境的掠夺,使得我们的地球正面临着前所未有的环境危机。环境污染、全球变暖、大规模灭绝等问题不断困扰着我们,似乎指向了人类生存的最后机…...

头歌-Python 基础

第1关:建模与仿真 1、 建模过程,通常也称为数学优化建模(Mathematical Optimization Modeling),不同之处在于它可以确定特定场景的特定的、最优化或最佳的结果。这被称为诊断一个结果,因此命名为▁▁▁。 填空1答案:决…...

C++数据结构:B树

目录 一. 常见的搜索结构 二. B树的概念 三. B树节点的插入和遍历 3.1 插入B树节点 3.2 B树遍历 四. B树和B*树 4.1 B树 4.2 B*树 五. B树索引原理 5.1 索引概述 5.2 MyISAM 5.3 InnoDB 六. 总结 一. 常见的搜索结构 表示1为在实际软件开发项目中,常用…...

【07】ES6:对象的扩展

一、对象字面量语法扩展 1、属性简写 当属性名称和属性值的变量名称相同时,可以省略冒号的变量名称。 const foo barconst baz { foo } // 等同于 const baz { foo: foo }baz // { foo: bar }function f(x, y) {return { x, y } } // 等同于 function f(x, y)…...

flink找不到隐式项

增加 import org.apache.flink.streaming.api.scala._ 即可...

【网络编程】-- 04 UDP

网络编程 6 UDP 6.1 初识Tomcat 服务端 自定义 STomcat S 客户端 自定义 C浏览器 B 6.2 UDP 6.2.1 udp实现发送消息 接收端: package com.duo.lesson03;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketExceptio…...

【脚本】图片-音视频-压缩文件处理

音视频处理 一,图片操作1,转换图片格式2,多张图片合成视频 二,音频操作1,转换音频格式2,分割音频为多段3,合成多段音频 三,视频操作1,转换视频格式2,提取视频…...