代理模式(Proxy Pattern)
代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理模式的目标是在不改变原始对象的情况下,控制对该对象的访问,以实现一些额外的功能,如延迟加载、访问控制、日志记录、缓存等。
代理模式的核心思想是创建一个代理对象,该代理对象具有与原始对象相同的接口,以便客户端可以无缝地使用代理。代理对象通常在其内部包含对原始对象的引用,并可以在执行其操作之前或之后执行额外的操作。
场景
远程代理:代理对象可以代表远程对象,客户端通过代理对象与远程对象通信,而不需要直接访问远程对象。
虚拟代理:代理对象可以用于延迟加载,只有在需要时才真正创建和访问原始对象,以提高性能。
访问控制:代理对象可以控制客户端对原始对象的访问,实施访问权限控制。
缓存代理:代理对象可以维护缓存,以减少对原始对象的频繁访问,从而提高性能。
实现
// 原始对象
class RealObject {
constructor() {
this.sensitiveData = "This is sensitive information";
}
getData() {
return this.sensitiveData;
}
}
// 代理对象
class ProxyObject {
constructor() {
this.realObject = new RealObject();
}
getData() {
// 在此进行访问控制或其他额外操作
if (this.isAuthorized()) {
return this.realObject.getData();
} else {
return "Unauthorized access";
}
}
isAuthorized() {
// 模拟访问控制,可以根据需要实现具体逻辑
return true; // 简化示例,始终授权
}
}
// 客户端代码
const realObject = new RealObject();
console.log(realObject.getData()); // 输出原始数据
const proxyObject = new ProxyObject();
console.log(proxyObject.getData()); // 输出代理数据,经过访问控制
在上面的示例中,RealObject 是原始对象,它包含敏感信息。ProxyObject 是代理对象,它在 getData 方法中实施了访问控制。客户端可以使用代理对象来访问数据,代理对象负责控制访问权限,并可以在必要时执行额外的操作。
代理模式使得可以在不改变原始对象的情况下,对访问进行控制和增强,从而提供了更大的灵活性和可维护性。这种模式在实际应用中经常用于安全控制、延迟加载和性能优化等场景。