
代理模式
发布日期:2021-05-09 00:29:22
浏览次数:14
分类:博客文章
本文共 2216 字,大约阅读时间需要 7 分钟。
代理模式
代理模式Proxy Pattern
,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,是一种对象结构型模式。
描述
在某些情况下,不想或者不能直接引用一个对象,此时可以通过一个称之为代理的第三者来实现 间接引用,代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式。
模式结构
Subject
: 抽象主题角色。Proxy
: 代理主题角色。RealSubject
: 真实主题角色。
优点
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度。
- 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
- 保护代理可以控制对真实对象的使用权限。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。
适用环境
- 远程
Remote
代理: 为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使Ambassador
。 - 虚拟
Virtual
代理: 如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 Copy-on-Write
代理: 它是虚拟代理的一种,把复制操作延迟到只有在客户端真正需要时才执行,一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write
代理可以让这个操作延迟,只有对象被用到的时候才被克隆。- 保护
Protect or Access
代理: 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。 - 缓冲
Cache
代理: 为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 - 防火墙
Firewall
代理:保护目标不让恶意用户接近。 - 同步化
Synchronization
代理:使几个用户能够同时使用一个对象而没有冲突。 - 智能引用
Smart Reference
代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。
实现
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 = 1; } 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})();
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://juejin.im/post/6844903555036364814https://www.runoob.com/design-pattern/proxy-pattern.htmlhttps://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/singleton.html
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月26日 14时52分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 简明教程 --- 21,Python 继承与多态
2019-03-06
KNN 算法-理论篇-如何给电影进行分类
2019-03-06
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2019-03-06
CODING 敏捷实战系列课第三讲:可视化业务分析
2019-03-06
使用 CODING DevOps 全自动部署 Hexo 到 K8S 集群
2019-03-06
工作动态尽在掌握 - 使用 CODING 度量团队效能
2019-03-06
CODING DevOps 深度解析系列第二课报名倒计时!
2019-03-06
CODING DevOps 线下沙龙回顾二:SDK 测试最佳实践
2019-03-06
数据结构第八节(图(下))
2019-03-06
基于Mustache实现sql拼接
2019-03-06
POJ 2260 Error Correction 模拟 贪心 简单题
2019-03-06
CSUOJ Water Drinking
2019-03-06
Spring MVC+javamail实现邮件发送
2019-03-06
gRPC在 ASP.NET Core 中应用学习(一)
2019-03-06
@SuppressWarnings 用法
2019-03-06
看完你就明白的锁系列之锁的状态
2019-03-06
看完这篇操作系统,和面试官扯皮就没问题了
2019-03-06
我的价值观
2019-03-06
一文详解 Java 并发模型
2019-03-06
值类型与引用类型(中)
2019-03-06