代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,用于在不改变原始对象的情况下,为其提供代理对象,以控制对原始对象的访问。
代理模式通常用于以下情况:
- 远程代理:用于在不同进程或计算机之间进行通信。
- 虚拟代理:用于延迟加载或计算昂贵的对象。
- 安全代理:用于控制对敏感对象的访问权限。
- 智能代理:用于添加附加行为,例如缓存或日志记录。
代理模式通常包括以下组件:
- 抽象主题(Subject):定义了代理对象和原始对象的公共接口。
- 具体主题(Concrete Subject):实现了抽象主题接口,是代理模式中的原始对象。
- 代理(Proxy):实现了抽象主题接口,并包含一个对具体主题的引用。
- 客户端(Client):使用代理对象来调用具体主题。
下面是一个代理模式的Java示例,演示了如何使用代理模式来控制对敏感对象的访问权限。
首先,我们定义一个Subject接口,它包含一个request方法:
public interface Subject {
void request();
}
然后,我们定义一个具体的Subject类RealSubject,它实现了Subject接口:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
接下来,我们定义一个代理类Proxy,它实现了Subject接口,并包含一个对RealSubject的引用。Proxy类可以在执行request方法之前或之后添加一些附加行为,例如检查权限或记录日志:
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy() {
this.realSubject = new RealSubject();
}
@Override
public void request() {
if (checkAccess()) {
realSubject.request();
logRequest();
}
}
private boolean checkAccess() {
System.out.println("Proxy: Checking access prior to executing request.");
return true;
}
private void logRequest() {
System.out.println("Proxy: Logging the time of request.");
}
}
最后,我们可以使用代理类来访问具体主题:
Subject subject = new Proxy();
subject.request();
// Output:
// Proxy: Checking access prior to executing request.
// RealSubject: Handling request.
// Proxy: Logging the time of request.
通过使用代理模式,我们可以在不改变RealSubject对象的情况下,添加附加行为来控制对它的访问。这可以使我们更好地控制敏感对象的访问权限,并且可以在需要时添加附加行为,而无需修改RealSubject对象的代码。