10.python设计模式【代理模式】

  • 内容:为其他对象提供一种代理一控制对这个对象的访问

  • 应用场景:

    • 远程代理: 为远程的对象提供代理
    • 虚代理:根据需要创建很大的对象
    • 保护代理:控制对原始对象的访问,用于对象有不同访问权限时
  • UML图
    在这里插入图片描述

  • 举个例子:
    需求:完成一个文件读取和写入,完成远程代理、需代理、保护代理。

from abc import ABCMeta,abstractmethod
# 代理抽象类
class Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):pass@abstractmethoddef set_content(self,content):pass# 远程代理
class RealSubject(Subject):def __init__(self,filename):self.filename=filenamef=open(filename,'r',encoding='utf-8')print(f)print("读取文件内容")self.content=f.read()f.close()def get_content(self):return self.contentdef set_content(self, content):f=open(self.filename,'w')f.write(content)f.close()# 虚代理
class VirtualProxy(Subject):def __init__(self,filename):self.filename=filenameself.subj=Nonedef get_content(self):if not self.subj:self.subj=RealSubject(self.filename)def set_content(self,content):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.set_content(content)# 保护代理
class ProtectedProxy(Subject):def __init__(self,filename):self.subj=RealSubject(filename)def get_content(self):return self.subj.get_content()def set_content(self, content):raise PermissionError("无写入权限")# 远程代理
subj=RealSubject('../test.txt')# 虚拟代理
vir=VirtualProxy('../test.txt')
vir.get_content()
vir.set_content("写入文本内容")# 保护代理
protect=ProtectedProxy('../test.txt')
protect.get_content()
protect.set_content("写入文件")
  • 优点:
    • 远程代理:可以隐藏对象位于远程地址空间的事实
    • 虚代理:可以进行优化,例如根据要求创建对象
    • 保护代理:允许在访问一个对象时有一些附加的内务处理

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

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

相关文章

WIZnet W6100-EVB-Pico DHCP 配置教程(三)

前言 在上一章节中我们讲了网络信息配置,那些网络信息的配置都是用户手动的去配置的,为了能跟电脑处于同一网段,且电脑能成功ping通板子,我们不仅要注意子网掩码,对于IP地址主机位和网络位的划分,而且还要注…

【unity】Pico VR 开发笔记(基础篇)

Pico VR 开发笔记(基础篇) XR Interaction Tooikit 版本 2.3.2 一、环境搭建 其实官方文档已经写的很详细了,这里只是不废话快速搭建,另外有一项官方说明有误的,补充说明一下,在开发工具部分说明 插件安装——安装pico的sdk和XR…

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一(python爬虫入门三Selenium的使用实例详解) 编程小白的自学笔记十(python爬虫入门二实例代码详解) 编程小白的自学笔记九(python爬虫入门代码详解) 目录 系列文章…

指针应用基础练习

(1)一级指针,二级指针 void getString(char **p) {*p "hello world"; }int main(void) {char *str NULL;getString(&str);printf("%s\n", str); } 代码分析: 定义了一个char型指针str,…

uni-app踩坑记

打包h5如何配置域名: 在manifest.json中配置域名 配置完成后无论是测试环境还是正式环境都带上/mobile/,否则会报错404 如何引入调试工具erada: 在默认的index.html中直接引入erada,页面样式会整个错乱,解决方案就是引入官方…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数: 槽函数: mainwondow: cpp文件: #include "mainwindow.h"…

WebSocket协议解析

文章目录 概要一、WS原理1.1、帧格式 二、WS实战2.1、客户端发起协议升级请求2.2、服务端响应协议升级2.3、核心事件2.4、心跳保活 三、总结 概要 项目中的IM系统是基于WebSocket做的,所以这里聊一下。 说到WS,不得不提HTTP,HTTP是基于TCP,面…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十二天 42/50【unordered_set】【双指针处理连续】【翻转字符串】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

AD21原理图的高级应用(五)自定义原理图模板及调用

(五)自定义原理图模板及调用 1.创建原理图模板2.调用原理图模板 1.创建原理图模板 利用 Altium Designer 软件在原理图中创建自己的模板,可以在图纸的右下角绘制一个表格用于显示图纸的一些参数,例如文件名、作者、修改时间、审核者、公司信息、图纸总数…

shopee,lazada,etsy店群如何高效安全的管理

对于电商卖家来说,要经营多个店铺,管理多个账号是非常常见的操作。为了避免账号关联被平台识别出来,需要使用防关联的浏览器来进行操作 ​1、支持多平台 支持同时管理多个电商平台店铺,Shopee、Lazada、etsy、poshmark、vinted等&…

Vue.js 生命周期函数

系列文章目录 Vue.js基础简答题 文章目录 系列文章目录前言一、创建阶段1.beforeCreate2.created3.beforeMount4.mounted 二、运行阶段1.beforeUpdate2.updated 三、销毁阶段1.beforeDestroy2.destroyed 总结 前言 Vue.js 生命周期指的是Vue实例的生命周期; Vue实…

【RabbitMQ】Linux系统服务器安装RabbitMQ

一、下载 首先应该下载erlang,rabbitmq运行需要有erland环境。 官网地址:https://www.erlang.org/downloads 下载rabbitmq 官网环境:https://www.rabbitmq.com/download.html 注意:el7对应centos7,el8对应centos8…

在Word中快速输入方框对号

在Word中输入方框对号播报文章 先输入“2611”,然后同时按ALTX, 插入 符号 其他符号

主流开源监控系统一览

减少故障有两个层面的意思,一个是做好常态预防,不让故障发生;另一个是如果故障发生,要能尽快止损,减少故障时长。而监控的典型作用,就是帮助我们发现及定位故障,这两个环节对于减少故障时长至关…

STM32 串口学习(二)

要用跳线帽将PA9与RXD相连,PA10与TXD相连。 软件设计 void uart_init(u32 baud) {//UART 初始化设置UART1_Handler.InstanceUSART1; //USART1UART1_Handler.Init.BaudRatebound; //波特率UART1_Handler.Init.WordLengthUART_WORDLENGTH_8B; //字长为 8 位数据格式U…

CAN通信的位定时与同步

位定时与同步 1.位时间 1.1相关基本概念 1)系统时钟:记为 t c l k t_{clk} tclk​; 2)CAN时钟周期:CAN时钟是由系统时钟分频而来的一个时间长度值,表示CAN控制器的工作时钟,实际上就是一个时…

网络编程套接字

网络编程套接字 预备知识理解源IP地址和目的IP地址认识端口号理解 "端口号" 和 "进程ID"理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序 socket编程接口socket 常见APIsockaddr结构 简单的UDP网络程序UDP通用服务端udp服务端初始化udp服务端启…

自动化运维工具——Ansible

自动化运维工具——Ansible 一、Ansible概述二、ansible 环境安装部署1.管理端安装 ansible2.ansible 目录结构3.配置主机清单4.配置密钥对验证 三、ansible 命令行模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9&a…

自定义一个仿拼多多地址选择器

前言 做了一个仿拼多多的地址选择器,但是与拼多多实现方法有些出入,大体效果是差不多的。废话不多说,先上一张效果动图: 开始 先说说本文的一些概念。地区级别:就是比如省级,市级,县级&#x…

map,set的封装(基于改造红黑树)

目录 引言 1.迭代器 2.map的[]重载 3.KeyOfValue模板参数 4.整体代码展示 //改造后的红黑树代码 #include <iostream> using namespace std;enum Colour {RED 0,BLACK, };//为了实现map与set封装使用同一个模板红黑树&#xff0c;前者的value是pair&#xff0c;后者…