• 设计模式-代理模式


            代理模式是一种设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式可以用于实现访问控制、远程访问、延迟加载等功能。

            在Java中,代理模式可以通过以下方式实现:

            1. 静态代理:
            - 创建一个接口(Subject),定义了被代理对象和代理对象的共同行为。
            - 创建一个被代理类(RealSubject),实现了接口,并提供了具体的实现逻辑。
            - 创建一个代理类(ProxySubject),实现了接口,并在内部持有一个被代理对象的引用。代理类可以在调用被代理对象之前或之后执行额外的逻辑。
            - 在客户端中,通过实例化代理类来访问被代理对象。

            以下是一个简单的示例代码,演示了如何使用静态代理实现代理模式:

    1. // 接口
    2. interface Image {
    3. void display();
    4. }
    5. // 被代理类
    6. class RealImage implements Image {
    7. private String filename;
    8. public RealImage(String filename) {
    9. this.filename = filename;
    10. loadFromDisk();
    11. }
    12. private void loadFromDisk() {
    13. System.out.println("Loading image: " + filename);
    14. }
    15. @Override
    16. public void display() {
    17. System.out.println("Displaying image: " + filename);
    18. }
    19. }
    20. // 代理类
    21. class ProxyImage implements Image {
    22. private RealImage realImage;
    23. private String filename;
    24. public ProxyImage(String filename) {
    25. this.filename = filename;
    26. }
    27. @Override
    28. public void display() {
    29. if (realImage == null) {
    30. realImage = new RealImage(filename);
    31. }
    32. realImage.display();
    33. }
    34. }
    35. // 客户端
    36. public class Main {
    37. public static void main(String[] args) {
    38. Image image = new ProxyImage("image.jpg");
    39. // 图像加载和显示由代理类控制
    40. image.display();
    41. }
    42. }

             在这个示例中,Image接口定义了被代理对象和代理对象的共同行为。RealImage类是被代理类,实现了Image接口,并提供了具体的实现逻辑。ProxyImage类是代理类,实现了Image接口,并在内部持有一个RealImage对象的引用。在display方法中,代理类可以在调用被代理对象之前或之后执行额外的逻辑。在客户端中,通过实例化代理类来访问被代理对象。

            2. 动态代理:
            - 创建一个接口(Subject),定义了被代理对象和代理对象的共同行为。
            - 创建一个实现了InvocationHandler接口的代理处理器类(ProxyHandler),在invoke方法中实现对被代理对象方法的调用和额外逻辑的处理。
            - 使用Java提供的Proxy类的静态方法newProxyInstance来创建代理对象。该方法接受一个类加载器、一组接口和一个代理处理器对象作为参数。
            - 在客户端中,通过调用代理对象的方法来访问被代理对象。


             以下是一个简单的示例代码,演示了如何使用动态代理实现代理模式:

    1. import java.lang.reflect.InvocationHandler;
    2. import java.lang.reflect.Method;
    3. import java.lang.reflect.Proxy;
    4. // 接口
    5. interface Image {
    6. void display();
    7. }
    8. // 被代理类
    9. class RealImage implements Image {
    10. private String filename;
    11. public RealImage(String filename) {
    12. this.filename = filename;
    13. loadFromDisk();
    14. }
    15. private void loadFromDisk() {
    16. System.out.println("Loading image: " + filename);
    17. }
    18. @Override
    19. public void display() {
    20. System.out.println("Displaying image: " + filename);
    21. }
    22. }
    23. // 代理处理器类
    24. class ProxyHandler implements InvocationHandler {
    25. private Object target;
    26. public ProxyHandler(Object target) {
    27. this.target = target;
    28. }
    29. @Override
    30. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    31. System.out.println("Before method: " + method.getName());
    32. Object result = method.invoke(target, args);
    33. System.out.println("After method: " + method.getName());
    34. return result;
    35. }
    36. }
    37. // 客户端
    38. public class Main {
    39. public static void main(String[] args) {
    40. Image realImage = new RealImage("image.jpg");
    41. // 创建代理对象
    42. Image proxyImage = (Image) Proxy.newProxyInstance(
    43. realImage.getClass().getClassLoader(),
    44. realImage.getClass().getInterfaces(),
    45. new ProxyHandler(realImage)
    46. );
    47. // 图像加载和显示由代理对象控制
    48. proxyImage.display();
    49. }
    50. }

            在这个示例中,Image接口定义了被代理对象和代理对象的共同行为。RealImage类是被代理类,实现了Image接口,并提供了具体的实现逻辑。ProxyHandler类是代理处理器类,实现了InvocationHandler接口,在invoke方法中实现了对被代理对象方法的调用和额外逻辑的处理。在客户端中,通过调用Proxy类的newProxyInstance方法来创建代理对象,该方法接受一个类加载器、一组接口和一个代理处理器对象作为参数。通过代理对象调用方法时,代理处理器会在方法调用前后执行额外的逻辑。

            动态代理模式可以在运行时创建代理对象,使得代理对象的行为可以动态地改变,提供了更大的灵活性和扩展性。

  • 相关阅读:
    Druid 数据库连接池 详解
    Session是什么?它与Cookie有什么区别?
    flutter plugins插件【二】【FlutterAssetsGenerator】
    2023年中国智慧医院市场现状及行业发展趋势分析[图]
    我做了一个世界杯的可视化网站...
    记一次Nacos线程数飙升排查
    Git的简单使用
    剑指offer——第8期
    Linux基础测试题(虚拟机和物理机相ping出现的问题)
    【ES】---Aggregation聚合,遇到String类型如何分组
  • 原文地址:https://blog.csdn.net/m0_65014849/article/details/133940503