每天一个设计模式·代理商模式

  • 时间:2018-11-26 23:24 作者:godbmw 来源:godbmw 阅读:592
  • 扫一扫,手机访问
摘要:代理商模式·原文地址更多《设计模式系列教程》更多免费教程博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢)两种语言实现。固然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)0. 项目地址本节课代码《每天一个
  • 代理商模式·原文地址
  • 更多《设计模式系列教程》
  • 更多免费教程

博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript靠这吃饭)和python纯粹喜欢)两种语言实现。固然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)

0. 项目地址

  • 本节课代码
  • 《每天一个设计模式》地址

1. 什么是代理商模式?

代理商模式的定义:为一个对象提供一种代理商以方便对它的访问。

代理商模式可以处理避免对少量对象的直接访问,以此为基础,常见的有保护代理商和虚拟代理商。保护代理商可以在代理商中直接拒绝对对象的访问;虚拟代理商可以推迟访问到真正需要的时候,以节省程序开销。

2. 代理商模式优缺点

代理商模式有高度解耦、对象保护、易修改等优点。

同样地,由于是通过“代理商”访问对象,因而开销会更大,时间也会更慢。

3. 代码实现

3.1 python3 实现

class Image:  def __init__(self, filename):    self.filename = filename  def load_img(self):    print("finish load " + self.filename)  def display(self):    print("display " + self.filename)# 借助继承来实现代理商模式class ImageProxy(Image):  def __init__(self, filename):    super().__init__(filename)    self.loaded = False  def load_img(self):    if self.loaded == False:      super().load_img()    self.loaded = True  def display(self):    return super().display()if __name__ == "__main__":  proxyImg = ImageProxy("./js/image.png")  # 只加载一次,其它均被代理商阻拦  # 达到节省资源的目的  for i in range(0,10):    proxyImg.load_img()  proxyImg.display()

3.2 javascript 实现

main.js :

// main.jsconst myImg = {  setSrc(imgNode, src) {    imgNode.src = src;  }};// 利用代理商模式实现图片懒加载const proxyImg = {  setSrc(imgNode, src) {    myImg.setSrc(imgNode, "./image.png"); // NO1. 加载占位图片并且将图片放入<img>元素    let img = new Image();    img.onload = () => {      myImg.setSrc(imgNode, src); // NO3. 完成加载后, 升级 <img> 元素中的图片    };    img.src = src; // NO2. 加载真正需要的图片  }};let imgNode = document.createElement("img"),  imgSrc =    "https://pic.songma.com/wenzhang/20181126/khh44ufucj0137.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp";document.body.appendChild(imgNode);proxyImg.setSrc(imgNode, imgSrc);

main.html :

<!-- main.html --><!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <meta http-equiv="X-UA-Compatible" content="ie=edge">  <title>每天一个设计模式 · 代理商模式</title></head><body>  <script src="./main.js"></script></body></html>

4. 参考

  • 代理商模式
  • 《JavaScript 设计模式和开发实践》
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】【Azure API Management】实目前API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account(2025-10-16 23:53)
【系统环境|】【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this opera...(2025-10-16 23:52)
【系统环境|】YouTube账号购买全攻略|点击查看原文购买|购买YouTube账号、油管号自动发货服务的优势与缺点 附:YouTube无法加载?可能是这个设置在作怪!(2025-10-16 23:52)
【系统环境|】【Azure Developer】Azure Automation 自动化账号生成的时候怎么生成连接 与证书 (Connection & Certificate)(2025-10-16 23:41)
【系统环境|】【Azure Redis 缓存】如何使得Azure Redis可以仅从内网访问? Config 及 Timeout参数配置(2025-10-16 23:40)
【系统环境|】近日,四川宜宾,某地下停车场内的监控拍到了一幕惊险的画面。危险!一汽车修理师傅正在修理一辆3吨重的悍马时,悍马车突然自己启动,眼看就要撞向前面的一辆灰色轿车了,一侧的修理师傅做出了一个令人始料不...(2025-10-16 23:38)
【系统环境|】iOS 能耗监控与电池优化实战:如何查看App耗电量、分析CPU、GPU内存使用、(uni-app iOS开发性能调试指南)(2025-10-16 23:37)
【系统环境|】《风流女管家》法国犯罪悬疑片--《风流女管家》法语高清全集免费在线无广告完整观看---《风流女管家》HD正版免费播放-手机电脑皆可看(2025-10-16 23:36)
【系统环境|】2025含金量排名前十计算机专业证书(2025-10-15 20:51)
【系统环境|】你有白帽众测 我有黑帽雇佣(2025-10-15 20:50)
手机二维码手机访问领取大礼包
返回顶部