設計模式:常見軟體開發挑戰的有效解決方案。 這些預先建造的解決方案可以防止“重新發明輪子”,為經常出現的問題提供答案。 然而,它們並不是一刀切的。開發人員必須調整模式以適應特定的專案需求。
設計模式分為三組:創建型、結構型、行為型,每組都有獨特的特徵。本文重點介紹一種流行的結構模式:代理模式。
要掌握代理模式,請考慮以下場景:存取使用者資料需要先透過單獨的服務取得 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
,產生模擬 JWT。 JWTService
<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>代理
快取並驗證 JWT。 JWTServiceProxy
<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中文網其他相關文章!