Java设计模式学习之代理模式
代理模式
代理模式(Proxy Pattern)是结构型设计模式之一,它为其他对象提供一个代理对象以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。这种模式在实际编程中非常常见,它可以帮助我们控制对资源的访问,提高系统的灵活性和安全性。
代理模式的主要角色包括:
- Subject(主题接口):定义了真实对象和代理对象共有的接口,这样代理可以用来代替真实对象。
- Real Subject(真实主题):定义了代理所代表的真实对象,实现了主题接口。
- Proxy(代理主题):包含了对真实主题的引用,实现了与真实主题相同的接口,并在访问真实主题之前或之后添加额外的处理。
代理模式的几种类型:
- 静态代理:在代码编译时就已经确定代理类和目标类的关系。
- 动态代理:在程序运行时,通过反射机制动态创建代理类。
应用场景:
- 访问控制:在访问某个对象之前,可能需要进行权限检查或验证。代理模式可以在访问真实对象之前进行这些检查。
- 延迟初始化:如果创建对象的成本很高,可以使用代理模式来延迟对象的创建,直到真正需要时才创建。
- 日志记录:在访问对象的操作前后添加日志记录,而不需要修改对象本身的代码。
- 缓存:代理模式可以用来实现对象的缓存,以提高性能。
- 远程代理:为位于不同地址空间的对象提供局部代表,隐藏对象存在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象,例如复杂的图形对象。
- 保护代理:控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。
- 智能引用:在访问对象时执行额外的动作,比如引用计数、加载持久对象到内存等。
优点:
- 安全性:可以控制对原始对象的访问。
- 延迟初始化:只有在需要时才创建对象,节省资源。
- 扩展性:可以在不修改原始对象的情况下,通过代理添加额外的功能。
缺点:
- 复杂性:增加了系统的复杂性,因为需要额外的代理类。
- 性能:可能因为代理的额外处理而影响性能。
// 定义一个接口
interface Subject {
void request();
}
// 实现了Subject接口的真实对象
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 客户端代码
public class NoProxyDemo {
public static void main(String[] args) {
// 直接创建并使用真实对象来处理请求
Subject realSubject = new RealSubject();
realSubject.request();
}
}
使用代理模式后:
// 定义一个接口
interface Subject {
void request();
}
// 实现了Subject接口的真实对象
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 实现了Subject接口的代理类
class Proxy implements Subject {
private RealSubject realSubject;
// 在需要时,代理类可以延迟创建真实对象
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
// 直接调用真实对象的方法,这里没有添加额外处理逻辑
realSubject.request();
}
}
// 客户端代码
public class SimpleProxyDemo {
public static void main(String[] args) {
// 使用代理类来处理请求
Subject proxy = new Proxy();
proxy.request();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体