Java设计模式之代理模式

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式在软件开发中经常被使用,它可以提供额外的功能,例如远程访问、延迟加载、访问控制和日志记录等。

代理模式涉及三个主要角色:

  1. 抽象主题(Subject):定义了真实主题和代理主题之间的共同接口,这样代理对象就可以通过实现该接口来替代真实主题。
  2. 真实主题(Real Subject):定义了代理对象所代表的真实对象。代理对象将请求转发给真实主题对象,从而完成实际的操作。
  3. 代理(Proxy):维护一个引用,使得代理可以访问真实主题,并提供与真实主题相同的接口,以便代理对象可以替代真实主题对象。

下面是一个简单的示例,展示了如何使用代理模式实现对敏感信息的访问控制:

java 复制代码
// 抽象主题
public interface SensitiveInformation {
    void access();
}

// 真实主题
public class SensitiveInformationImpl implements SensitiveInformation {
    @Override
    public void access() {
        System.out.println("访问敏感信息");
    }
}

// 代理
public class SensitiveInformationProxy implements SensitiveInformation {
    private SensitiveInformation realSubject;

    public SensitiveInformationProxy() {
        this.realSubject = new SensitiveInformationImpl();
    }

    @Override
    public void access() {
        if (checkAccess()) {
            realSubject.access();
        } else {
            System.out.println("无权访问敏感信息");
        }
    }

    private boolean checkAccess() {
        // 检查访问权限的逻辑
        return false;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        SensitiveInformation proxy = new SensitiveInformationProxy();
        proxy.access();
    }
}

在上面的示例中,SensitiveInformation 是抽象主题接口,定义了访问敏感信息的方法 access()SensitiveInformationImpl 是真实主题类,实现了抽象主题接口,并提供了实际的敏感信息访问逻辑。SensitiveInformationProxy 是代理类,实现了抽象主题接口,并在 access() 方法中添加了访问控制的逻辑,只有在满足访问权限的条件下才会调用真实主题的 access() 方法。

通过使用代理模式,我们可以在不修改真实主题代码的情况下,通过代理对象来控制对真实主题的访问。这种方式可以提供更好的灵活性和安全性。

相关推荐
smileNicky5 分钟前
Lombok @Data 在 IDEA 中运行报错解决方案
java·ide·intellij-idea
计算机学姐5 分钟前
基于SpringBoot的汉服租赁系统【颜色尺码套装+个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
qq_5470261797 分钟前
Maven 仓库管理
java·maven
天天摸鱼的java工程师10 分钟前
线程池深度解析:核心参数 + 拒绝策略 + 动态调整实战
java·后端
mjhcsp10 分钟前
C++ KMP 算法:原理、实现与应用全解析
java·c++·算法·kmp
邵伯17 分钟前
Java源码中的排序算法(一)--Arrays.sort()
java·排序算法
阿里巴巴P8高级架构师24 分钟前
从0到1:用 Spring Boot 4 + Java 21 打造一个智能AI面试官平台
java·后端
stevenzqzq26 分钟前
trace和Get thread dump的区别
java·android studio·断点
桦说编程26 分钟前
并发编程踩坑实录:这些原则,帮你少走80%的弯路
java·后端·性能优化
程序猿零零漆27 分钟前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十三)SpringMVC快速入门、请求处理
java·学习·spring