设计模式: 代理模式

目录

一,代理模式和适配器模式区别

二,代理模式

三,特点

四,组成部分和实现步骤

五,案例

六,应用场景


一,代理模式和适配器模式区别

  • 意图:代理模式控制访问并可能添加额外功能,而适配器模式转换接口以兼容。
  • 代理与对象:代理模式代理一个对象,该对象可能不存在或不希望直接访问;适配器模式转换一个已存在的不兼容对象的接口。
  • 使用场景:代理模式常用于访问控制、延迟初始化等;适配器模式常用于兼容旧系统或第三方库。
  • 接口:代理模式中,代理和实际对象通常实现相同的接口;适配器模式中,适配器实现目标接口,同时包含一个适配者的实例。

在实际应用中,选择哪种模式取决于你的具体需求。如果你需要控制对对象的访问或添加额外功能,使用代理模式;如果你需要使不兼容的接口变得兼容,使用适配器模式。

二,代理模式

代理模式(Proxy Pattern)是一种常用的软件设计模式,属于结构型模式。它为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理模式可以在不改变对象的代码的情况下,为该对象添加额外的功能,例如延迟初始化、访问控制、日志记录、缓存等。

三,特点

  1. 控制访问:代理对象可以控制对真实对象的访问,提供额外的安全检查或其他功能。

  2. 延迟初始化:代理对象可以在需要时才创建真实对象,从而实现延迟加载。

  3. 访问日志:代理对象可以记录对真实对象的访问情况,用于调试或监控。

  4. 简化接口:代理对象可以提供一个更简单的接口,隐藏真实对象的复杂性。

  5. 智能引用:代理对象可以被视为对真实对象的智能引用,它在访问真实对象之前执行额外的操作。

四,组成部分和实现步骤

代理模式的组成部分通常包括:

  • Subject(主题)接口:定义了真实对象和代理对象共有的接口。
  • Real Subject(真实主题)类:实现了主题接口的具体业务类。
  • Proxy(代理)类:也实现了主题接口,它包含对真实对象的引用,并在内部维护真实对象的生命周期。

代理模式的实现步骤通常如下:

  1. 定义Subject接口,包含业务方法。
  2. 创建RealSubject类,实现Subject接口,并实现具体的业务逻辑。
  3. 创建Proxy类,实现Subject接口,并包含一个RealSubject对象的引用。

Proxy类的方法在内部调用RealSubject对象的方法之前或之后可以添加额外的逻辑。

五,案例

java 复制代码
// 主题接口
interface Subject {
    void request();
}

// 真实主题类
class RealSubject implements Subject {
    public void request() {
        System.out.println("真实主题处理请求");
    }
}

// 代理类
class Proxy implements Subject {
    private RealSubject realSubject;

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request(); // 代理对象处理请求,内部委托给真实对象
    }
}

在这个示例中,Proxy 类作为代理对象,它实现了与 RealSubject 相同的 Subject 接口。客户端通过代理对象来访问真实对象的功能,而代理对象可以在内部控制对真实对象的访问。

代理模式在实际应用中非常广泛,特别是在需要控制对象访问或为对象添加额外功能的场景中。通过使用代理模式,可以在不修改真实对象的情况下,控制对象的使用,并可以在代理对象中添加额外的处理逻辑。

六,应用场景

  1. 远程代理(RMI):Java的远程方法调用(RMI)使用代理模式,允许一个Java虚拟机调用另一个Java虚拟机上的对象。代理对象作为远程对象的代理,处理所有与远程对象的交互1。

  2. Spring AOP:Spring框架中的一个核心概念是面向切面编程(AOP),它使用代理模式来实现。Spring AOP通过创建目标对象的代理对象,可以在不修改目标对象的情况下,控制横切关注点(如日志、事务管理等)的执行126。

  3. MyBatis:MyBatis框架也使用代理模式,通过创建Mapper接口的代理对象来实现对数据库的操作。当调用Mapper接口的方法时,实际上是调用了代理对象中定义的SQL语句12。

  4. 延迟初始化:在Java中,可以使用代理模式来实现延迟初始化,即在需要时才创建对象。这有助于提高应用的启动速度和性能1。

  5. 访问控制:代理对象可以在访问实际对象之前进行权限检查,确保只有拥有合适权限的用户才能访问实际对象1。

  6. 日志记录:通过代理模式,可以在访问实际对象的操作前后添加日志记录代码,实现日志功能与业务逻辑的分离1。

  7. 缓存:代理模式可以实现缓存功能,在代理对象中添加缓存逻辑,以减少对数据库的访问次数,提高系统性能1。

  8. 事务管理:在业务逻辑层,可以通过代理模式为每个业务方法自动添加事务管理代码,而无需在每个业务方法中显式编写事务代码7。

  9. 责任链模式:在处理业务流程时,代理模式可以与责任链模式结合使用,实现对请求的多个处理对象的有序访问7。

  10. 动态代理:Java提供了动态代理机制,允许在运行时动态创建代理类。这在Spring框架中尤为常见,用于在不修改原有类代码的情况下,动态地为对象添加功能

相关推荐
李广坤1 天前
状态模式(State Pattern)
设计模式
李广坤1 天前
观察者模式(Observer Pattern)
设计模式
李广坤1 天前
中介者模式(Mediator Pattern)
设计模式
李广坤1 天前
迭代器模式(Iterator Pattern)
设计模式
李广坤1 天前
解释器模式(Interpreter Pattern)
设计模式
阿无,1 天前
java23种设计模式之前言
设计模式
Asort2 天前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机2 天前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の2 天前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom2 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式