描述:为其他对象提供一种代理,以访问这个对象
优点:分为静态代理和动态代理
缺点:每个对象都需要对应一个代理类,原对象改变时需要代理对象也需要改变,增加函数处理时间
静态代理
特点:被代理对象和代理对象,需要实现相同接口或者继承相同的父类
优点:不改变原对象,通过代理对象扩展原对象的功能
动态代理
特点:代理对象不需要接口,但目标对象要实现接口,动态地在内存中构建代理对象
优点:代理对象不需要实现接口
应用:远程代理,虚拟代理,保护代理,智能代理
classDiagram
class Subject{
<>
doOperation() void
}
class RealSubject{
+doOperation()
}
class MyProxy{
-target:Subject
constructor(realSubject : Subject)
+doOperation()
}
Subject <|.. RealSubject :实现
Subject <|.. MyProxy:实现
RealSubject ..o MyProxy
- 接口类,需要实现一个方法
- 真实对象类,实现了这个方法
- 代理类,实例时缓存真实对象的类的实例,通过代理类调用真实对象的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| interface Subject { doOperation() : void; } class RealSubject implements Subject { public doOperation() { console.log('我是RealSubject类,正在执行'); } } class MyProxy implements Subject { private target : Subject; constructor(realSubject : Subject) { this.target = realSubject; } public doOperation() { console.log('我是代理类'); this.target.doOperation(); } } const realSubject : Subject = new RealSubject(); const myProxy : Subject = new MyProxy(realSubject); myProxy.doOperation();
|
- 接口类,需要实现一个方法
- 真实对象类,实现了这个方法
- 代理类工厂,实例时缓存真实对象的类的实例,通过代理类的系统,也通过代理类调用真实对象的方法,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| interface Subject { doOperation() : void; } class RealSubject implements Subject { constructor() {} public doOperation() : void { console.log('我是RealSubject类,正在执行'); } } class ProxyFactory { private target : any; constructor(target : any) { this.target = target; } public getProxyInstance() : any { return new Proxy(this.target, { get: (target, propKey) => { return target[propKey]; } }); } } const target : Subject = new RealSubject(); const proxyInstance : Subject = <Subject>new ProxyFactory(target).getProxyInstance(); proxyInstance.doOperation();
|