博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一个设计模式·代理模式
阅读量:6691 次
发布时间:2019-06-25

本文共 1695 字,大约阅读时间需要 5 分钟。

博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用
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. 加载占位图片并且将图片放入元素    let img = new Image();    img.onload = () => {      myImg.setSrc(imgNode, src); // NO3. 完成加载后, 更新  元素中的图片    };    img.src = src; // NO2. 加载真正需要的图片  }};let imgNode = document.createElement("img"),  imgSrc =    "https://upload-images.jianshu.io/upload_images/5486602-5cab95ba00b272bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp";document.body.appendChild(imgNode);proxyImg.setSrc(imgNode, imgSrc);

main.html :

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

4. 参考

  • 《JavaScript 设计模式和开发实践》

转载地址:http://pfeao.baihongyu.com/

你可能感兴趣的文章
MySQL中的存储函数和存储过程的简单示例
查看>>
SQL中EXISTS的用法
查看>>
格子取数问题 2013年搜狗的校招笔试题 专业程序代写
查看>>
1.40-CAE封装6个实例单门制作
查看>>
批量转换word文档到pdf文件
查看>>
node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
查看>>
兼容不同浏览器的CSS前缀-webkit-,-ms-,-moz-,-o-
查看>>
UITbaleView上按钮的单选
查看>>
GULP入门之API(二)
查看>>
HTTP断点续传
查看>>
yii2 支付宝支付教程 [ 2.0 版本 ]
查看>>
oracle存储过程例子,包含函数,动态执行sql
查看>>
ASP.NET MVC+Bootstrap个人博客之praise.js点赞特效插件(二)
查看>>
Python---函数,递归
查看>>
Tri Tiling
查看>>
SPIR-V*:面向 OpenCL™ 工作负载的英特尔® 显卡编译器默认接口
查看>>
[项目管理]记一次项目评审会中关于网站安全的答疑
查看>>
36. Valid Sudoku
查看>>
git使用
查看>>
Spark Streaming揭秘 Day26 JobGenerator源码图解
查看>>