代理模式

代理模式

  • What: 为一个对象提供一个代用品或占位符,以便控制对他的访问
  • where: 图片预加载,合并http请求(上传、切换页面请求数据)、防火墙代理、远程代理、保护代理(权限)、写时复制代理
  • when:
  • who:
  • why:
  • how:

代理模式分类

  1. 保护代理:过滤无效请求。
  2. 虚拟代理:将一些开销很大的部分,延迟到需要时创建。

为什么使用代理

  1. 单一职责原则(功能分离,设置img和预加载分离),开放封闭原则(后期修改可分功能更改)。
  2. 代理和本体接口一致性(使用方无感知),后期去除用户无感知

应用实例

图片预加载

<!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>Document</title>
    <style>
        img {
            width: 200px;
            height: 200px;
            border: 1px solid red;
        }
    </style>
</head>

<body>

    <script>
        // 图片预加载
        var myImage = (function () {
            var imgNode = document.createElement('img');
            var dom = document.body;
            dom.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) {
                    var localImg = 'file:///Users/lixueyan01/Documents/myCode/proxy/2.jpeg';
                    myImage.setSrc(localImg); // 设置预加载图片
                    img.src = src;
                }
            }
        })();

        var img = 'https://upload-images.jianshu.io/upload_images/17067918-0e5ba09e3ba5d0e4.jpeg?imageMogr2/auto-orient/strip|imageView2/2/w/670/format/webp';
        proxyImage.setSrc(img);
    </script>
</body>

</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>Document</title>
</head>
<body>
    <input type="checkbox" id="1">1</input>
    <input type="checkbox" id="2">2</input>
    <input type="checkbox" id="3">3</input>
    <input type="checkbox" id="4">4</input>
    <input type="checkbox" id="5">5</input>
    <input type="checkbox" id="6">6</input>
    <input type="checkbox" id="7">7</input>

    <script>

        var synchronousFile = function(id) {
            console.log('开始同步文件 id:' + id);
        };

        var proxySynchronousFile = (function() {
            var cache = [];
            var timer;

            return function(id) {
                cache.push(id);
                if (timer) {
                    return;
                }

                timer = setTimeout(function() {
                    synchronousFile(cache.join(','));
                    clearTimeout(timer);
                    timer = null;
                    cache.length = 0;
                }, 2000);
            }
        })();

        var checkbox = document.getElementsByTagName('input');
        for (var i = 0, c; c = checkbox[i++];) {
            c.onclick = function() {
                if (this.checked === true) {
                    proxySynchronousFile(this.id);
                }
            };
        }

    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值