飞雪连天射白鹿,笑书神侠倚碧鸳

0%

【23种设计模式】13代理模式

描述:为其他对象提供一种代理,以访问这个对象
优点:分为静态代理和动态代理
缺点:每个对象都需要对应一个代理类,原对象改变时需要代理对象也需要改变,增加函数处理时间

静态代理

特点:被代理对象和代理对象,需要实现相同接口或者继承相同的父类

优点:不改变原对象,通过代理对象扩展原对象的功能

动态代理

特点:代理对象不需要接口,但目标对象要实现接口,动态地在内存中构建代理对象

优点:代理对象不需要实现接口

应用:远程代理,虚拟代理,保护代理,智能代理


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();
听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本