你好世界
  • 入门
  • 框架
  • Webpack
  • 模式
  • 知识点
  • 面试题
  • Koa
  • Java
  • Python
  • MongoDB
  • Redis
  • Algorithm
  • AI 概述
  • 机器学习
  • 深度学习
  • 自然语言处理
  • 关键词说明
  • 使用技巧
  • 本地模型安装及下载
  • 调试
  • 测试
  • GIT
  • Network
  • Linux
  • VSCode
  • GitHub
  • Mock
  • 入门
  • 框架
  • Webpack
  • 模式
  • 知识点
  • 面试题
  • Koa
  • Java
  • Python
  • MongoDB
  • Redis
  • Algorithm
  • AI 概述
  • 机器学习
  • 深度学习
  • 自然语言处理
  • 关键词说明
  • 使用技巧
  • 本地模型安装及下载
  • 调试
  • 测试
  • GIT
  • Network
  • Linux
  • VSCode
  • GitHub
  • Mock
  • DesignMode

    • 设计模式
    • 面向对象
    • UML 类图
    • 设计原则
    • 面试题分析
    • 工厂模式
    • 单例模式
    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式(网关?)
    • 观察者模式
    • 迭代器模式
    • 状态模式
    • 其它设计模式
  • SoftwareArchitecturePatterns

    • SoftwareArchitecturePatterns (软件架构模式)
    • MVVC
    • MVC
    • MVP

代理模式

介绍

  • 使用者无权访问目标对象;
  • 中间加代理,通过代理做授权和控制;

设计原则验证

  • 代理类和目标类分离,隔离开目标类和使用者
  • 符合开放封闭原则

示例

  • 科学上网,访问 github.com;
  • 明星经纪人;
示例-8
class ReadImg {
  constructor(fileName){
    this.fileName = fileName;
    this.loadFromDisk(); // 初始化即从硬盘中加载,模拟
  }
  display(){
    console.log("diaplay..." + this.fileName);
  }
  loadFromDisk(){
    console.log("loading..." + this.fileName);
  }
}

class ProxyImg {
  constructor(fileName) {
    console.log('测试', fileName)
    this.realImg = new ReadImg(fileName);
  }
  display() {
    this.realImg.display();
  }
}

// 测试
let proxyImg = new ProxyImg("1.png");
proxyImg.display();

场景

  • 网页事件代理
  • jQuery $.proxy
  • ES6 Proxy
    // 明星
    let star = {
      name: '*爽',
      age: 666,
      phone: "12354685792"
    }
    
    // 经纪人
    let agent = new Proxy(star, {
      get: function(target, key){
        if(key === 'phone') {
          // 返回经纪人手机号
          return "65656565956"
        }
        if(key === 'price') {
          // 明星不报价,经纪人报价
          return 3080000;
        }
        return target[key];
      },
      set: function(target, key, val) {
        if(key === 'customPrice'){
          if(val < 2080000){
            // 最低 208万/日
            throw new Error('价格太低')
          } else {
            target[key] = val
            return true;
          }
        }
      }
    })
    
    // 测试
    console.log(agent.name)
    console.log(agent.age)
    console.log(agent.phone)
    console.log(agent.price)
    
    agent.customPrice = 10000000;
    console.log(agent.customPrice)
    

对比

代理模式VS适配器模式

  • 适配器模式:提供一个不同的接口(如不同版本的插头)

  • 代理模式:提供一摸一样的接口

    代理模式VS装饰器模式

  • 装饰器模式:扩展模式,原有功能不变且可直接使用

  • 代理模式:显示原有功能,但是经过限制或者阉割之后

最后更新时间: 3/7/22, 9:11 PM
贡献者: DESKTOP-ER5718D\zt
Prev
装饰器模式
Next
外观模式(网关?)