Java 走 Proxy:深入理解代理模式

在 Java 编程中,代理模式是一种强大的设计模式,可以为对象的访问提供间接的控制。通过代理类,开发者可以控制对真实对象的引用,添加额外的功能,如日志记录、权限控制、延迟加载等。这篇文章将解释代理模式的基本原理,并提供代码示例,帮助你更好地理解 Java 中的代理。

代理模式的概述

代理模式包括以下几个角色:

  1. 主题(Subject):定义一个接口,供真实主题和代理实现。
  2. 真实主题(Real Subject):实现了主题接口,表示我们真正要调用的对象。
  3. 代理(Proxy):实现了主题接口,持有对真实主题的引用,并在调用真实主题的操作前后添加额外的功能。
代理模式的关系图

使用 Mermaid 语法,我们可以绘制出代理模式的关系图:

erDiagram
    Subject {
        +request()
    }
    RealSubject {
        +request()
    }
    Proxy {
        +request()
    }
    
    Subject --|> RealSubject
    Subject --|> Proxy

代码示例

我们将实现一个简单的代理模式示例,模拟一个图书馆借书的场景。

1. 定义主题接口

首先,我们定义一个主题接口,Book,它包含一个 borrow() 方法:

public interface Book {
    void borrow();
}
  • 1.
  • 2.
  • 3.
2. 实现真实主题

接下来,创建真实主题 RealBook,它实现了 Book 接口,并提供实际的借书功能:

public class RealBook implements Book {
    private String title;

    public RealBook(String title) {
        this.title = title;
    }

    @Override
    public void borrow() {
        System.out.println("You have borrowed the book: " + title);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
3. 实现代理

现在,创建 ProxyBook 作为代理类,添加借书前后的操作,比如记录日志:

public class ProxyBook implements Book {
    private RealBook realBook;

    public ProxyBook(String title) {
        this.realBook = new RealBook(title);
    }

    @Override
    public void borrow() {
        System.out.println("Logging: Borrowing book.");
        realBook.borrow();
        System.out.println("Logging: Successfully borrowed book.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
4. 使用代理类

最后,在主方法中使用代理类进行借书操作:

public class Main {
    public static void main(String[] args) {
        Book book = new ProxyBook("Design Patterns: Elements of Reusable Object-Oriented Software");
        book.borrow();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
运行结果

当运行以上代码时,输出会是:

Logging: Borrowing book.
You have borrowed the book: Design Patterns: Elements of Reusable Object-Oriented Software
Logging: Successfully borrowed book.
  • 1.
  • 2.
  • 3.

在这个示例中,我们可以看到代理类 ProxyBook 在调用 realBook.borrow() 之前和之后添加了日志记录,这展示了代理模式的实际应用。

代理模式的类图

使用 Mermaid 语法,我们还可以绘制出代理模式的类图:

Subject +borrow() RealBook -title: String +borrow() ProxyBook -realBook: RealBook +borrow()

总结

代理模式是一种非常有用的设计模式,它允许你为对象的访问添加额外的控制。这在许多场景下都非常有用,例如日志记录、安全检查和延迟加载。通过代理类,我们可以在不更改真实对象的情况下,增加或修改其功能。

在本文中,我们通过 Java 中的简单示例演示了代理模式的工作原理,并用 Mermaid 语法绘制了关系图和类图,帮助你更好地理解这一模式的结构和用途。希望本文能够为你在日常开发中实现和使用代理模式提供启发。