首页 >Java >java教程 >设计模式系列—结构篇:代理模式

设计模式系列—结构篇:代理模式

Linda Hamilton
Linda Hamilton原创
2025-01-21 04:06:16728浏览

设计模式:常见软件开发挑战的有效解决方案。 这些预先构建的解决方案可以防止“重新发明轮子”,为经常出现的问题提供答案。 然而,它们并不是一刀切的。开发人员必须调整模式以适应特定的项目需求。

设计模式分为三组:创建型、结构型和行为型,每组都有独特的特征。本文重点介绍一种流行的结构模式:代理模式。

理解代理模式

要掌握代理模式,请考虑以下场景:访问用户数据需要首先通过单独的服务获取 JWT(JSON Web Token)。

问题

如果没有代理模式,每个用户数据请求都需要一个 JWT 请求,从而导致性能瓶颈,特别是在 JWT 服务缓慢或令牌过期时间未有效管理的情况下。这种低效的方法如下图所示:

Design Patterns Serie — Structural Chapter: Proxy Pattern

这种重复的 JWT 获取会减慢数据检索速度。

Design Patterns Serie — Structural Chapter: Proxy Pattern

解决方案在于代理模式。

解决方案

代理模式在客户端和真实对象(JWT 服务)之间引入了一个中间层——代理。该中介管理访问,添加缓存或安全检查等功能。

Design Patterns Serie — Structural Chapter: Proxy Pattern

这通过缓存 JWT 来提高效率,减少对 JWT 服务的调用。 使用代理模式的改进架构如下所示:

Design Patterns Serie — Structural Chapter: Proxy Pattern

类图说明了实现:

Design Patterns Serie — Structural Chapter: Proxy Pattern

类图显示:

  • 主题(JWTService):由代理和真实 JWT 服务实现的公共接口。 它定义了 requestJWT() 方法。
  • 真实主题 (JWTServiceImpl): 实现 JWTService 并提供实际的 JWT 生成功能。
  • 代理 (JWTServiceProxy): 控制对 JWTServiceImpl 的访问。它添加了缓存和验证逻辑。

实现 JWT 生成的代理模式

完整的代码示例可在 代理模式存储库 中找到。 以下是关键组件:

JWT 对象

JWT 类(使用 Java 16 记录)存储 JWT 数据(令牌、过期时间、创建时间),并包含用于检查有效性的 validateJWT() 方法。

<code class="language-java">public record JWT(String token, long expirationTime, long creationTime) {
    public boolean validateJWT(){
        long currentTimeInSeconds = System.currentTimeMillis() / 1000;
        return currentTimeInSeconds < creationTime + expirationTime;
    }
}</code>

主题(界面)

JWTService 接口声明 requestJWT() 方法。

<code class="language-java">public interface JWTService {
    JWT requestJWT();
}</code>

真实主题

JWTServiceImpl 实现 JWTService,生成模拟 JWT。

<code class="language-java">public class JWTServiceImpl implements JWTService {
    @Override
    public JWT requestJWT() {
        return new JWT(generateToken(), 5, System.currentTimeMillis() / 1000);
    }

    // ... generateToken() method (simplified for this example) ...
}</code>

代理

JWTServiceProxy 缓存并验证 JWT。

<code class="language-java">public class JWTServiceProxy implements JWTService {
    private final JWTService jwtService;
    private JWT jwt;

    public JWTServiceProxy() {
        this.jwtService = new JWTServiceImpl();
    }

    @Override
    public JWT requestJWT() {
        if (jwt == null || !jwt.validateJWT()) {
            jwt = jwtService.requestJWT();
        }
        return jwt;
    }
}</code>

测试代理模式

一个简单的测试演示了代理的缓存行为:

<code class="language-java">// ... (Main class with logging and Thread.sleep(5000) to simulate token expiration) ...</code>

输出显示最初仅生成一个 JWT,并且仅在第一个 JWT 过期后才生成新的 JWT,演示了代理的缓存和验证功能。

Design Patterns Serie — Structural Chapter: Proxy Pattern

结论

代理模式提高了软件效率和安全性。 通过仔细考虑系统架构和潜在瓶颈,开发人员可以利用此模式来创建更健壮且可维护的应用程序。 请记住根据您的特定需求调整模式。 快乐编码! ❤️

以上是设计模式系列—结构篇:代理模式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn