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();
}
}