zoukankan      html  css  js  c++  java
  • JavaScript 设计模式-代理模式

    代理模式

    • 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
    # 实现方法
    定义一个委托者和一个代理,需要委托的事情在代理中完成
    使用场景: 在某些情况下,一个客户类不想或者不能直接引用一个委托对象,
    而代理类对象可以在客户类和委托对象之间起到中介的作用。代理可以帮客户过滤掉一些请求并且把一些开销大的对象,
    延迟到真正需要它时才创建。中介购车、代购、课代表替老师收作业
    
    class Letter {
      constructor(name) {
        this.name = name
      }
    }
    
    // 暗恋人-小明
    let XiaoMing = {
      name: '小明',
      sendLetter(proxy) {
        proxy.receiveLetter(this.name)
      }
    }
    
    // 代理人-小华
    let XiaoHua = {
      receiveLetter(customer) {
        XiaoHong.listenWhenGlad(() => {
          // 当小红心情好时才送情书, 也在送情书时创建情书
          XiaoHong.receiveLetter(new Letter(customer + '的情书'))
        })
      }
    }
    
    // 女神-小红
    let XiaoHong = {
      name: '小红',
      receiveLetter(letter) {
        console.info(`${this.name}收到${letter.name}`)
      },
      listenWhenGlad(fn) {
        setTimeout(() => {
          fn()
        }, 1000);
      }
    }
    
    // 委托人发送情书给代理
    XiaoMing.sendLetter(XiaoHua)
    
    # 过程分析
     * 小明发送情书给代理(小华) 并附属上自己的名字(这件事就小明就等通知了,可以去做其他的事了)
     * 代理(小华)收到情书
     * 开始等心情好的时候(干的就是中介的活)(心情好可以理解为是个异步调用,不知道什么时候心情好.女人啊)
     * 终于等到了小红心情好的时候,然后发送情书,并且告诉小红告诉自己(中介)收到信后的反应
     * 然后执行小红收到信后的回调函数
    

    Proxy

    • Proxy 是 ES6 提供的专门以代理角色出现的代理器,Vue 3.0 的响应式数据部分弃用了 Object.defineProperty,使用 Proxy 来代替它。
    var proxy = new Proxy(target, handler);
    

    Proxy-使用场景

    -为了保护不及格的同学,课代表拿到全班成绩单后只会公示及格人的成绩。对考分有疑问的考生,复议后新分数比以前大10分才有权利去更新成绩

    const scoreList = {
      'wang': 90,
      'li': 60,
      'zhang': 100
    }
    
    const scoreProxy = new Proxy(scoreList, {
      get: function (scoreList, name) {
        if (scoreList[name] > 69) {
          console.info('输出成绩')
          console.info(scoreList[name])
        } else {
          console.info('不及格的成绩无法公示.')
        }
      },
      set: function (scoreList, name, newVal) {
        if (newVal - scoreList[name] > 10) { // 修改后分差不到10分的不能进行修改
          console.info(`${scoreList[name]}=>${newVal}`)
          scoreList[name] = newVal
        } else {
          console.info('无法修改成绩')
        }
      }
    })
    
    // get
    console.info(' ------------- 测试 proxy -get  -------------')
    scoreProxy['wang']
    scoreProxy['li']
    
    console.info(' ------------- 测试 proxy -set ------------- ')
    // set
    scoreProxy['li'] = 99
    scoreProxy['li']
    
    Keep learning
  • 相关阅读:
    PID控制原理和算法
    Android 按钮长按下去重复执行某个动作,放开后停止执行动作
    最小二乘法拟合非线性函数及其Matlab/Excel 实现
    Android 基于蓝牙的方向控制器
    Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
    input 只允许输入数字
    java scoket编程
    RBAC权限管理
    整理大型网站架构必知必会的几个服务器知识
    Java中Class<T>与Class<?>的区别
  • 原文地址:https://www.cnblogs.com/leslie1943/p/13511064.html
Copyright © 2011-2022 走看看