代理模式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