前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代理模式

代理模式

作者头像
WindRunnerMax
修改2020-10-27 14:49:18
3810
修改2020-10-27 14:49:18
举报
文章被收录于专栏:Czy‘s Blog

代理模式

代理模式Proxy Pattern,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,是一种对象结构型模式。

描述

在某些情况下,不想或者不能直接引用一个对象,此时可以通过一个称之为代理的第三者来实现 间接引用,代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式。

模式结构

  • Subject: 抽象主题角色。
  • Proxy: 代理主题角色。
  • RealSubject: 真实主题角色。

优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度。
  • 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
  • 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  • 保护代理可以控制对真实对象的使用权限。

缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。

适用环境

  • 远程Remote代理: 为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使Ambassador
  • 虚拟Virtual代理: 如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
  • Copy-on-Write代理: 它是虚拟代理的一种,把复制操作延迟到只有在客户端真正需要时才执行,一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
  • 保护Protect or Access代理: 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
  • 缓冲Cache代理: 为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  • 防火墙Firewall代理:保护目标不让恶意用户接近。
  • 同步化Synchronization代理:使几个用户能够同时使用一个对象而没有冲突。
  • 智能引用Smart Reference代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。

实现

代码语言:javascript
复制
Copy
class Subject{
    constructor(){
        this.name = null;
        this.__id = null;
    }
    say(){
        throw new Error("Abstract method cannot be called");
    }
}

class RealSubject extends Subject{
    constructor(){
        super();
        this.name = "real subject";
        this.__id = ;
    }
    say(){
        console.log(this.name);
    }
}

class SubjectProxy{
    constructor(){
        this.instance = new RealSubject;
    }

    say(){
        this.instance.say();
    }

    getProperty(key){
        if(/^_{1,2}.*$/.test(key)) throw new Error("Properties beginning with _ or __ are not allowed to be accessed");
        return this.instance[key];
    }
}

(function() {
    var subject = new SubjectProxy();
    subject.say(); // real subject
    console.log(subject.getProperty("name")); // real subject
    // console.log(subject.getProperty("__id")); // Uncaught Error: Properties beginning with _ or __ are not allowed to be accessed
})();


每日一题

代码语言:javascript
复制
Copy
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:javascript
复制
Copy
https://juejin.im/post/6844903555036364814
https://www.runoob.com/design-pattern/proxy-pattern.html
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/singleton.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代理模式
    • 描述
      • 模式结构
      • 优点
      • 缺点
      • 适用环境
    • 实现
      • 每日一题
        • 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档