首頁 >Java >java教程 >設計模式系列—結構篇:代理模式

設計模式系列—結構篇:代理模式

Linda Hamilton
Linda Hamilton原創
2025-01-21 04:06:16731瀏覽

設計模式:常見軟體開發挑戰的有效解決方案。 這些預先建造的解決方案可以防止“重新發明輪子”,為經常出現的問題提供答案。 然而,它們並不是一刀切的。開發人員必須調整模式以適應特定的專案需求。

設計模式分為三組:創建型、結構型、行為型,每組都有獨特的特徵。本文重點介紹一種流行的結構模式:代理模式。

理解代理模式

要掌握代理模式,請考慮以下場景:存取使用者資料需要先透過單獨的服務取得 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,產生模擬 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,演示了代理程式的快取和驗證功能。

Design Patterns Serie — Structural Chapter: Proxy Pattern

結論

代理模式提高了軟體效率和安全性。 透過仔細考慮系統架構和潛在瓶頸,開發人員可以利用此模式來創建更健壯且可維護的應用程式。 請記住根據您的特定需求調整模式。 快樂編碼! ❤️

以上是設計模式系列—結構篇:代理模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn