【设计模式】第14节:结构型模式之“代理模式”

news2024/12/23 13:20:25

一、简介

代理模式(Proxy Design Pattern)在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。

二、优点

  • 关注点分离
  • 访问控制
  • 延迟实例化
  • 远程访问
  • 缓存
  • 增加附加功能

三、应用场景

  • 访问控制
  • 缓存
  • 保护代理
  • 远程对象
  • 智能引用
  • 其他:日志记录、监控和审计等

四、UML类图

请添加图片描述

五、案例

银行提供存款和取款两种功能,不同权限的用户功能不同,只有管理权限的账号能存取款,普通用户只能存款。

package main

import "fmt"

type BankAccount interface {
	Deposit(amount float64)
	Withdraw(amount float64)
}

type RealBankAccount struct {
	Balance float64
}

func NewRealBankAccount(initialBalance float64) RealBankAccount {
	return RealBankAccount{Balance: initialBalance}
}

func (rba *RealBankAccount) Deposit(amount float64) {
	rba.Balance += amount
	fmt.Printf("Deposited: %v, new balance: %v\n", amount, rba.Balance)
}

func (rba *RealBankAccount) Withdraw(amount float64) {
	if rba.Balance >= amount {
		rba.Balance -= amount
		fmt.Printf("Withdrew: %v, new balance: %v\n", amount, rba.Balance)
	} else {
		fmt.Printf("Insufficient balance\n")
	}
}

type BankAccountProxy struct {
	UserRole        string
	RealBankAccount RealBankAccount
}

func NewBankAccountProxy(userRole string, initialBalance float64) BankAccountProxy {
	return BankAccountProxy{UserRole: userRole, RealBankAccount: NewRealBankAccount(initialBalance)}
}

func (proxy *BankAccountProxy) Deposit(amount float64) {
	if proxy.UserRole == "Admin" || proxy.UserRole == "User" {
		proxy.RealBankAccount.Deposit(amount)
	} else {
		fmt.Printf("Unauthorized access\n")
	}
}

func (proxy *BankAccountProxy) Withdraw(amount float64) {
	if proxy.UserRole == "Admin" {
		proxy.RealBankAccount.Withdraw(amount)
	} else {
		fmt.Printf("Unauthorized access\n")
	}
}

func main() {
	adminBankAccount := NewBankAccountProxy("Admin", 1000)
	adminBankAccount.Deposit(500)
	adminBankAccount.Withdraw(200)

	userBankAccount := NewBankAccountProxy("User", 1000)
	userBankAccount.Deposit(500)
	userBankAccount.Withdraw(200)
}

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

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

相关文章

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包,用于构建跨平台应用程序,支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo,支持linux/windows/mac/android/ios操作系统,此demo在ubuntu桌面环境下测试成功。…

Linux常用命令——chmod命令

在线Linux命令查询工具 chmod 用来变更文件或目录的权限 补充说明 chmod命令用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件…

http协议/https协议

http协议(HyperText Transfer Protocol - 超文本传输协议): 在网络层中被广为人知的协议,想必没有学过计算机的人都知道http是有关网站,网络的,那么究竟其中有哪些东西是需要计算机相关人员掌握的&#xff…

2023年CCF中国开源大会“大模型时代的智能化软件工程新范式”分论坛成功举行...

2023年CCF中国开源大会“大模型时代的智能化软件工程新范式”分论坛于10月21日在湖南长沙成功举行。本次论坛聚焦大模型时代的智能化软件新生态以及相应的软件工程新范式,邀请了多位来自学术界和工业界的专家进行分享和交流,共设置了5个主题报告和1个Pan…

2023年中国多功能电子书包产量、销量及市场规模分析[图]

多功能电子书包是一种便携式电子设备,旨在提供类似于传统纸质书包的功能,但具有更多的数字功能。它可以存储、阅读、编辑和分享电子书籍、文档、图片和音频/视频文件等。 多功能电子书包行业的优点 资料来源:共研产业咨询(共研网…

如何取消磁盘的BitLocker加密?

C盘被加密了,该怎么取消加密呢? 下面提供详细步骤供参考: 步骤1. 打开开始菜单,并点击齿轮图标,打开[设置] 步骤2. 在Windows设置视窗中点击[更新和安全] 步骤3. 点击左侧的[设备加密],然后点击视窗右侧的…

在Qt中List View和List Widget的区别是什么,以及如何使用它们

2023年10月29日,周日晚上 目录 List View和List Widget的区别 如何使用QListView 如何使用QListWidget List View和List Widget的区别 在Qt中,QListView 和 QListWidget 是用于显示列表数据的两个常用控件,它们有一些区别和特点。 1. 数…

基于SpringBoot的图书电子商务网站设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户管理 图书分类管理 图书信息管理 订单管理 用户功能实现 图书信息 购物车 确认下单 我的收藏 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 社会发展日新月异,用计算机应用…

【蓝桥杯选拔赛真题05】C++超级素数 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++超级素数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

BAT035.【工作常用批处理专栏】批处理功能说明及下载

引言:本文主要提供本专栏中练习的批处理功能进行说明和下载。 一、本专栏练习的批处理下载地址 链接:https://pan.baidu.com/s/1L_V-_LojpbfFcUFbvBK1_A 提取码:vady 二、本专栏练习的批处理汇总如下 【工作常用批处理专栏】批处理目录树: │ BAT001.CMD命令速查手册.h…

脚本木马编写

PHP小马编写 小马用waf扫描&#xff0c;没扫描出来有风险。 小马过waf之后用echo $_SERVER[DOCUMENT_ROOT]获得当前运行脚本所在的文档根目录。&#xff0c;然后在上传大马工具。 $_SERVER&#xff0c;参考&#xff1a;PHP $_SERVER详解 小马编写二次加密 现在是可以被安全…

uniapp中APP端使用echarts用formatter设置y轴保留2位小数点不生效

uniapp使用echarts&#xff0c;在内置浏览器中&#xff0c;设置保留2位小数能正常显示&#xff08;代码如下&#xff09;&#xff0c;但是在APP端这个设置不起作用。 yAxis: {type: value,axisLabel: {formatter: function (val) {return val.toFixed(2); //y轴始终保留小数点…

Flask_Login使用与源码解读

一、前言 用户登录后&#xff0c;验证状态需要记录在会话中&#xff0c;这样浏览不同页面时才能记住这个状态&#xff0c;Flask_Login是Flask的扩展&#xff0c;专门用于管理用户身份验证系统中的验证状态。 注&#xff1a;Flask是一个微框架&#xff0c;仅提供包含基本服务的…

redis-集群切片

切片集群 我曾遇到过这么一个需求&#xff1a;要用 Redis 保存 5000 万个键值对&#xff0c;每个键值对大约是 512B&#xff0c;为了能快速部署并对外提供服务&#xff0c;我们采用云主机来运行 Redis 实例&#xff0c;那么&#xff0c;该如何选择云主机的内存容量呢&#xff…

【设计模式】第10节:结构型模式之“组合模式”

一、简介 组合模式&#xff1a;将一组对象组织成树形结构&#xff0c;将单个对象和组合对象都看做树中的节点&#xff0c;以统一处理逻辑&#xff0c;并且它利用树形结构的特点&#xff0c;递归地处理每个子树&#xff0c;依次简化代码实现。使用组合模式的前提在于&#xff0…

【数据结构与算法】JavaScript实现集合与字典

文章目录 一、集合结构1.1.简介1.2.代码实现1.3.集合间的操作 二、字典结构2.1.简介2.2.封装字典 一、集合结构 1.1.简介 集合比较常见的实现方式是哈希表&#xff0c;这里使用JavaScript的Object类进行封装。 集合通常是由一组无序的、不能重复的元素构成。 数学中常指的集…

记录linux运行服务提示报错/bin/java: 没有那个文件或目录

描述&#xff1a;在执行jar启动命令时候提示 没有/bin/java 这个文件或者目录&#xff1b;然后我vi /usr/bin/java&#xff0c;是存在该文件的&#xff1b;那到底是什么问题呢&#xff0c;该不是没有创建软连接吧&#xff1f; 1、执行下述命令先测试下软链接是否有创建 ln -s …

SpringCloud微服务保护方案解读

目录 服务雪崩定义 问题的产生 示例 雪崩产生的几种场景 解决方案 熔断模式 隔离模式&#xff08;仓壁模式 &#xff09; 限流模式 超时处理 总结 服务保护技术对比 服务雪崩定义 我们都知道在微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务…

2023年中国特种运输现状及市场格局分析[图]

特种运输是使用特殊车辆、方案&#xff0c;将特种货物转移至需求地的过程。相对于常规货物&#xff0c;特种货物在本身特性&#xff08;危险品、鲜活货物&#xff09;、价值&#xff08;贵重物品&#xff09;、体积&#xff08;超大货物&#xff09;、重量&#xff08;超重货物…

【AD9361 数字接口CMOS LVDSSPI】C 并行数据 LVDS

接上一部分&#xff0c;AD9361 数字接口CMOS &LVDS&SPI 目录 一、LVDS模式数据路径和时钟信号LVDS模式数据通路信号[1] DATA_CLK[2] FB_CLK[3] Rx_FRAME[4] Rx_D[5&#xff1a;0][5] Tx_FRAME[6]Tx_D[5&#xff1a;0][7] ENABLE[8] TXNRX系列 二、LVDS最大时钟速率和信…