设计模式:常见软件开发挑战的有效解决方案。 这些预先构建的解决方案可以防止“重新发明轮子”,为经常出现的问题提供答案。 然而,它们并不是一刀切的。开发人员必须调整模式以适应特定的项目需求。
设计模式分为三组:创建型、结构型和行为型,每组都有独特的特征。本文重点介绍一种流行的结构模式:代理模式。
要掌握代理模式,请考虑以下场景:访问用户数据需要首先通过单独的服务获取 JWT(JSON Web Token)。
如果没有代理模式,每个用户数据请求都需要一个 JWT 请求,从而导致性能瓶颈,特别是在 JWT 服务缓慢或令牌过期时间未有效管理的情况下。这种低效的方法如下图所示:
这种重复的 JWT 获取会减慢数据检索速度。
解决方案在于代理模式。
代理模式在客户端和真实对象(JWT 服务)之间引入了一个中间层——代理。该中介管理访问,添加缓存或安全检查等功能。
这通过缓存 JWT 来提高效率,减少对 JWT 服务的调用。 使用代理模式的改进架构如下所示:
类图说明了实现:
类图显示:
requestJWT()
方法。JWTService
并提供实际的 JWT 生成功能。JWTServiceImpl
的访问。它添加了缓存和验证逻辑。完整的代码示例可在 代理模式存储库 中找到。 以下是关键组件:
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,演示了代理的缓存和验证功能。
代理模式提高了软件效率和安全性。 通过仔细考虑系统架构和潜在瓶颈,开发人员可以利用此模式来创建更健壮且可维护的应用程序。 请记住根据您的特定需求调整模式。 快乐编码! ❤️
以上是设计模式系列—结构篇:代理模式的详细内容。更多信息请关注PHP中文网其他相关文章!