代理模式
时间:2022-07-28
本文章向大家介绍代理模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式
代理模式Proxy Pattern
,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,是一种对象结构型模式。
描述
在某些情况下,不想或者不能直接引用一个对象,此时可以通过一个称之为代理的第三者来实现 间接引用,代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式。
模式结构
-
Subject
: 抽象主题角色。 -
Proxy
: 代理主题角色。 -
RealSubject
: 真实主题角色。
优点
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度。
- 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
- 保护代理可以控制对真实对象的使用权限。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。
适用环境
- 远程
Remote
代理: 为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使Ambassador
。 - 虚拟
Virtual
代理: 如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 -
Copy-on-Write
代理: 它是虚拟代理的一种,把复制操作延迟到只有在客户端真正需要时才执行,一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write
代理可以让这个操作延迟,只有对象被用到的时候才被克隆。 - 保护
Protect or Access
代理: 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。 - 缓冲
Cache
代理: 为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 - 防火墙
Firewall
代理:保护目标不让恶意用户接近。 - 同步化
Synchronization
代理:使几个用户能够同时使用一个对象而没有冲突。 - 智能引用
Smart Reference
代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。
实现
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
})();
每日一题
Copy
https://github.com/WindrunnerMax/EveryDay
参考
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
- 深度|Python股票数据分析
- HDU 2438 Turn the corner(三分查找)
- UVAlive 3708 Graveyard(最优化问题)
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
- Selenium2+python自动化19-单选和复选框
- Uva 11300 Spreading the Wealth(递推,中位数)
- Uva 11729 Commando War (简单贪心)
- UVA 11292 Dragon of Loowater(简单贪心)
- Codeforces Beta Round #2 A,B,C
- 牛顿迭代法(Newton's Method)
- 最长递减子序列(nlogn)(个人模版)
- Selenium2+python自动化26-js处理内嵌div滚动条
- Selenium2+python自动化25-js处理日历控件
- 转负二进制(个人模版)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何真正理解好一个「设计模式」?
- 10 行实现最短路算法
- 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字
- 【Rust日报】2020-08-16 Cranelift现在可以编译rustc,比LLVM的编译速度快7倍!
- 【Rust日报】2020-08-17 浏览器之外的 WebAssembly
- 前沿技术探讨:Rust语言真的安全吗?
- Java、Go和Rust间的比较
- 【文末送书】非常实用的 Python 技巧
- 消息队列:Rabbitmq如何保证不丢消息
- 二叉树:删除节点
- Go之heap