当前位置: 首页 > 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()
}
http://www.lryc.cn/news/259566.html

相关文章:

  • 外贸SOHO建站怎么做?海洋建站方法策略?
  • 商城免费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
  • 【淘宝网消费类电子产品销售数据可视化】
  • AI编译器及TVM概述
  • 排序-归并排序与计数排序
  • 国产数据库适配-人大金仓(kingbase V8R3)
  • HAAS 哈斯机床 读写刀补数据
  • Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目
  • BUUCTF crypto做题记录(4)新手向
  • 【ArcGIS微课1000例】0080:ArcGIS将shp转json(geojson)案例教程
  • 阿里云Centos8安装Dockers详细过程
  • leetcode 二数之和 三数之和 四数之和
  • 制衣厂生产ERP系统怎么样?制衣厂生产ERP软件哪个好
  • 安装 DevEco Studio 后不能用本地 Node.js 打开
  • AppLink+WMS,实现仓储管理一体化
  • 如果是你,你选SOHO还是跟单?
  • 大语言模型--能力
  • 安装LLaMA-Factory微调chatglm3,修改自我认知
  • 以太网协议与DNS
  • Spring Boot的日志
  • Cisco Packet Tracer配置命令——交换机篇
  • python单例模式
  • 环境保护:人类生存的最后机会
  • 头歌-Python 基础
  • C++数据结构:B树
  • 【07】ES6:对象的扩展
  • flink找不到隐式项
  • 【网络编程】-- 04 UDP
  • 【脚本】图片-音视频-压缩文件处理
  • 跨品牌的手机要怎样相互投屏?iPhone和iPad怎么相互投屏?