设计模式: 代理模式

目录

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

二,代理模式

三,特点

四,组成部分和实现步骤

五,案例

六,应用场景


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

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

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

二,代理模式

代理模式(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框架中尤为常见,用于在不修改原有类代码的情况下,动态地为对象添加功能

相关推荐
wrx繁星点点6 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干8 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨8 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
肘击鸣的百k路17 小时前
Java 代理模式详解
java·开发语言·代理模式
捕鲸叉17 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点17 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰18 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus18 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵18 小时前
设计模式-迭代器
设计模式
lexusv8ls600h19 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式