Javascript设计模式-06-代理模式

2023-10-28

Javascript设计模式 - 06 - 代理模式

简介

代理模式就是为其他对象提供一种代理(代用品或者占位符),以控制对这个对象的访问,代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口,以便在任何时候都能代替真实的对象

代理模式的关键是,当客户不方便直接访问一个对象或者不满足需求时 ,提供一个替身对象来控制这个对象的访问,客户实际上访问的是替身对象,替身对象对请求做一些处理之后,把请求转发给本体对象

分类(保护代理、虚拟代理、缓存代理)

  1. 保护代理:就是起到保护作用,一般用来过滤掉一些不必要的请求,将真正需要的递给本体,一般用来控制不通权限的对象对目标对象的访问
    // 创建用户类
    function User(name, role) {
        this.name = name;
        this.role = role;
    }

    User.prototype = {
        getName: function () {
            return this.name;
        },
        getRole: function () {
            return this.role;
        },
        accessHomePage: function () {
            console.log('in home page');
        },
        accessContractPage: function () {
            console.log('in contract page');
        },
        accessLogPage: function () {
            console.log('in log page');
        }
    };

    // 创建代理访问类
    function Proxy(user) {
        this.user = user;
    }
    Proxy.prototype = {
        getUser: function () {
            return this.user;
        },
        accessHomePage: function () {
            return this.user.accessHomePage();
        },
        accessContractPage: function () {
            if (this.user.getRole() === 'developer') {
                console.log('Have no legal power');
                return;
            }
            return this.user.accessContractPage();
        },
        accessLogPage: function () {
            if (this.user.getRole() === 'sales') {
                console.log('Have no legal power');
                return;
            }
            return this.user.accessLogPage();
        }
    }

    // 创建用户
    var sales = new User('xiaoming', 'sales');
    var developer = new User('xiaolan', 'developer');

    // 访问
    var proxySales = new Proxy(sales);
    var proxyDeveloper = new Proxy(developer);

    proxySales.accessContractPage(); // in contract page
    proxyDeveloper.accessContractPage(); // Have no legal power
  1. 虚拟代理:可以把开销很大的对象,延迟到真正需要他的时候创建,下边是借用这里的例子
    // 创建图片DOM
    var myImage = (function() {
            // 先创建一个空的节点
        var imgNode = document.createElement("img");
        document.body.appendChild(imgNode);

        return {
        setSrc: function(src) {
            // 控制此节点的 图片地址
          imgNode.src = src;
        }
        };
    })();

    // 代理
    var proxyImage = (function() {
        // 创建一个临时的 图片对象
    var img = new Image();
    // 使用图片对象加载目标图片(比较大的)加载完后图片会被浏览器缓存到本地,再次使用就不需要请求了
    img.onload = function() {
        // 图片缓存后,再次设置真实节点的图片地址
       myImage.setSrc(this.src);   
    };

    return {
      setSrc: function(src) {
        // 先用一个比较小的图片占位
        myImage.setSrc('../imgs/loading.gif');     // loading
        // 开始缓存比较大的图片,缓存完成后会自动执行 onload 函数
        img.src = src;
      }
    };
    })();

    proxyImage.setSrc('../imgs/xxx.jpg');
  1. 缓存代理:为一些开销大的运算结果,或者请求服务器的数据,提供暂时的存储,如果传入的参数一致,则返回存储的数据
    function fb(num) {
        if (num < 1) {
            return 1;
        }
        return num * fb(--num);
    }
    // 缓存代理
    var proxy = (function () {
        var cache = {};
        return function (num) {
            if (cache[num]) {
                console.log(`number ${num} has cached ${cache[num]}`);
                return cache[num];
            }
            cache[num] = fb(num);
            console.log(`new cache ${cache[num]}`);

            return cache[num];
        }
    }())

    proxy(10); // new cache 3628800
    proxy(15); // new cache 1307674368000
    proxy(10); // number 10 has cached 3628800

文章列表

  1. javascript设计模式 – 设计原则
  2. JavaScript设计模式–高阶函数
  3. Javascript 设计模式 - 01 - 原型模式
  4. Javascript 设计模式 - 02 - 单例模式
  5. Javascript 设计模式 - 03 - 建造者模式
  6. Javascript 设计模式 - 04 - 工厂模式
  7. Javascript 设计模式 - 05 - 外观模式
  8. Javascript 设计模式 - 06 - 代理模式
  9. Javascript 设计模式 - 07 - 观察者模式(发布订阅模式)
  10. Javascript 设计模式 - 08 - 策略模式
  11. Javascript 设计模式 - 09 - 命令模式
  12. Javascript 设计模式 - 10 - 迭代器模式
  13. Javascript 设计模式 - 11 - 职责链模式
  14. Javascript 设计模式 - 12 - 适配器模式
  15. Javascript 设计模式 - 13 - 模板方法
  16. Javascript 设计模式 - 14 - 组合模式
  17. Javascript 设计模式 - 15 - 享元模式
  18. Javascript 设计模式 - 16 - 中介者模式
  19. Javascript 设计模式 - 17 - 装饰者模式
  20. Javascript 设计模式 - 18 - 状态模式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript设计模式-06-代理模式 的相关文章

随机推荐

  • 新手入门必看MyBatis-Plus&Druid数据源

    MyBatis Plus Druid数据源 我们就一起来了解下Mybatis Plus吧 什么是MyBatis Plus MyBatis Plus的优势 MyBatis Plus简单来说就是在原本的MyBatis的基础上加了Buff或者说是
  • [系统安全] 四十四.恶意代码同源分析及BinDiff软件基础用法

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • 外盘期货的几个级别 你到达几级了?

    01 小白 如果开始赔了钱 就收手不做或者学会敬畏市场还好 但如果开始的福利期太顺或者太容易 就及其容易造成信心爆棚 对行情存在 赌 的思想 反而不利于以后的成长 这种情况基本出现在刚刚入市 实盘交易时间短的小白身上 02 筑基期 处在这一
  • 二叉树的扩展——主要方法和基本算法等

    1 求树的高度 思路 二叉树的高度等于左右子树里面的最大高度 int high BtNode ptr if ptr NULL return 0 int L high ptr gt lchild int R high ptr gt rchil
  • java.lang.IllegalStateException

    Caused by java lang IllegalStateException The specified child already has a parent You must call removeView on the child
  • 【SQL】保姆级教程:MySQL配置全过程 & 编辑器DBeaver的安装配置

    MySQL 是最流行的关系型数据库管理系统 在 WEB 应用方面 MySQL 是最好的 RDBMS Relational Database Management System 关系数据库管理系统 应用软件之一 文章目录 一 什么是数据库 二
  • 数字水印技术的原理、实现及其应用

    概述 数字水印 是指将特定的信息嵌入数字信号中 数字信号可能是音频 图片或是视频等 数字水印可分为浮现式和隐藏式两种 明水印 visible watermarking 其所包含的信息可在观看图片或视频时同时被看见 盲水印 blind wat
  • 计蒜客T1461——校验信用卡号码

    如题 本题需要解决的本质就是多个字符串转换为整型数据的过程 主要的考点在于如下3个 1 循环输入多个字符串并不间断 2 将字符串处理为整型数据 3 完成对整形数据的检验 上述三个要求通过STL可以很轻松地解决 具体做法写在了代码注释之中 i
  • Unity3D 4.0新功能:Mecanim动画系统基础教程

    作为Unity4 0的主要更新功能 Mecanim动画被寄予了很多的期望 系统有先进的地方 也有不足的地方 这些我们留到最后再来总结 阿赵粗略的学习了一下 写下以下的教程 这篇教程简单的说明了Mecanim系统的用法和控制方式 里面用到的资
  • electron-vue中报错 Cannot use import statement outside a module解决方案(亲测有效!!!)

    错误 Cannot use import statement outside a module 不能在模块之外使用导入语句 原因 安装的某个依赖包里使用了import语法 因为我们打包输出的是commonjs规范 所以不识别import语法
  • 学习笔记 React(一)Hello React例子及创建虚拟DOM的两种方式

    React官网地址 React库 最基础的例子 官网 1 英文官网 https reactjs org 2 中文官网 https react docschina org React库 babel min js ES6 gt ES5 JSX
  • C++中函数原型和函数定义

    C 中函数原型和函数定义 C 函数原型指的是函数声明的语法形式 它告诉编译器函数的名称 返回类型和参数列表 函数原型的语法形式如下 return type function name parameter list 其中 return typ
  • 什么是强制缓存?什么是协商缓存?cache

    强制缓存和协商缓存是用于在Web浏览器和服务器之间进行缓存控制的两种机制 强制缓存 强缓存 强制缓存 强制缓存是通过设置HTTP响应头来实现的 它告诉浏览器在一定时间内直接使用缓存的副本 而不需要再向服务器发起请求 常见的强制缓存相关的响应
  • PHP Filter伪协议Trick总结

    PHP Filter伪协议Trick总结 前言 最近在学习的过程中碰到了很多的filter协议的小trick 在此做一个总结以及对filter协议的一些探索 PHP Filter协议介绍 php filter是php中独有的一种协议 它是一
  • 题目0010-数据分类

    数据分类 题目描述 对一个数据a进行分类 分类方法是 此数据a 4个字节大小 的4个字节相加对一个给定值b取模 如果得到的结果小于一个给定的值c则数据a为有效类型 其类型为取模的值 如果得到的结果大于或者等于c则数据a为无效类型 比如一个数
  • SpringBoot配置文件

    1 springboot提供两种配置文件类型 properties和yml yaml 2 默认配置文件名称 properties 3 在同一级目录下优先级为 peoperties gt yml gt yaml YAML定义 三种配置文件写法
  • java基于HuTool工具类ExcelWriter合并单元格

    HuTool工具类ExcelWriter合并单元格 基于HuTool工具类ExcelWriter合并单元格并且使用 jdk1 8 lambda表达式 效果如下 创建注解 import java lang annotation Element
  • 内核篇加载内核模块(Android10)

    一 开发前期准备 本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试 交叉编译链使用的是linageOs源码中的交叉编译链 lineageOs源码中oneplus3内核源码位置路径 home qiang
  • WebGIS开发入门

    目录 一 WebGIS 二 GIS背景 三 如何入门webgis开发 1 gis数据处理 2 gis数据服务发布 3 gis数据服务调用 4 gis数据渲染 四 WebGIS核心价值 五 webgis发展方向 六 gis开发就业方向 1 数
  • Javascript设计模式-06-代理模式

    Javascript设计模式 06 代理模式 简介 代理模式就是为其他对象提供一种代理 代用品或者占位符 以控制对这个对象的访问 代理对象角色内部含有对真实对象的引用 从而可以操作真实对象 同时代理对象提供与真实对象相同的接口 以便在任何时