推荐答案
// www.javascriptcn.com code example
// 目标对象
class RealSubject {
request() {
console.log('RealSubject: Handling request.');
}
}
// 代理对象
class Proxy {
constructor(realSubject) {
this.realSubject = realSubject;
}
request() {
if (this.checkAccess()) {
this.realSubject.request();
this.logAccess();
}
}
checkAccess() {
console.log('Proxy: Checking access prior to firing a real request.');
return true;
}
logAccess() {
console.log('Proxy: Logging the time of request.');
}
}
// 使用代理
const realSubject = new RealSubject();
const proxy = new Proxy(realSubject);
proxy.request();本题详细解读
1. 代理模式的定义
代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下增加额外的功能。
2. 代码结构
RealSubject: 这是目标对象,它定义了代理对象所代表的真实对象。在这个例子中,
RealSubject类有一个request方法,用于处理实际的请求。Proxy: 这是代理对象,它持有一个对
RealSubject的引用,并实现了与RealSubject相同的接口。代理对象可以在调用RealSubject的request方法之前或之后执行一些额外的操作,例如权限检查、日志记录等。
3. 代码执行流程
- 客户端代码创建一个
RealSubject实例。 - 客户端代码创建一个
Proxy实例,并将RealSubject实例传递给代理。 - 客户端代码调用代理的
request方法。 - 代理对象首先调用
checkAccess方法检查权限。 - 如果权限检查通过,代理对象调用
RealSubject的request方法。 - 代理对象最后调用
logAccess方法记录请求时间。
4. 适用场景
- 延迟初始化(虚拟代理): 当你有一个重量级的对象,并且希望在真正需要时才创建它时,可以使用代理模式。
- 访问控制(保护代理): 当你希望控制对某个对象的访问权限时,可以使用代理模式。
- 日志记录(日志代理): 当你希望在访问对象时记录日志时,可以使用代理模式。
- 缓存(缓存代理): 当你希望缓存某些操作的结果时,可以使用代理模式。
5. 优点
- 职责清晰: 代理模式可以将与核心业务逻辑无关的功能(如权限检查、日志记录等)分离到代理对象中,使得代码更加清晰。
- 扩展性强: 通过代理模式,你可以在不修改目标对象的情况下增加新的功能。
6. 缺点
- 性能开销: 由于代理对象的存在,可能会增加额外的性能开销。
- 复杂性增加: 代理模式可能会增加代码的复杂性,特别是在代理对象和目标对象之间的交互较为复杂时。