首页 > 编程语言 >Java设计模式学习之代理模式

Java设计模式学习之代理模式

时间:2024-10-22 18:09:26浏览次数:1  
标签:Java 对象 request 代理 模式 访问 设计模式 Subject

代理模式


目录

代理模式(Proxy Pattern)是结构型设计模式之一,它为其他对象提供一个代理对象以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。这种模式在实际编程中非常常见,它可以帮助我们控制对资源的访问,提高系统的灵活性和安全性。

代理模式的主要角色包括:

  1. Subject(主题接口):定义了真实对象和代理对象共有的接口,这样代理可以用来代替真实对象。
  2. Real Subject(真实主题):定义了代理所代表的真实对象,实现了主题接口。
  3. Proxy(代理主题):包含了对真实主题的引用,实现了与真实主题相同的接口,并在访问真实主题之前或之后添加额外的处理。

代理模式的几种类型:

  1. 静态代理:在代码编译时就已经确定代理类和目标类的关系。
  2. 动态代理:在程序运行时,通过反射机制动态创建代理类。

应用场景:

  1. 访问控制:在访问某个对象之前,可能需要进行权限检查或验证。代理模式可以在访问真实对象之前进行这些检查。
  2. 延迟初始化:如果创建对象的成本很高,可以使用代理模式来延迟对象的创建,直到真正需要时才创建。
  3. 日志记录:在访问对象的操作前后添加日志记录,而不需要修改对象本身的代码。
  4. 缓存:代理模式可以用来实现对象的缓存,以提高性能。
  5. 远程代理:为位于不同地址空间的对象提供局部代表,隐藏对象存在于不同地址空间的事实。
  6. 虚拟代理:根据需要创建开销很大的对象,例如复杂的图形对象。
  7. 保护代理:控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。
  8. 智能引用:在访问对象时执行额外的动作,比如引用计数、加载持久对象到内存等。

优点:

  • 安全性:可以控制对原始对象的访问。
  • 延迟初始化:只有在需要时才创建对象,节省资源。
  • 扩展性:可以在不修改原始对象的情况下,通过代理添加额外的功能。

缺点:

  • 复杂性:增加了系统的复杂性,因为需要额外的代理类。
  • 性能:可能因为代理的额外处理而影响性能。
// 定义一个接口  
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();  
    }  
}

标签:Java,对象,request,代理,模式,访问,设计模式,Subject
From: https://www.cnblogs.com/BingBing-8888/p/18493459

相关文章