デザインパターン: 一般的なソフトウェア開発の課題に対する効率的なソリューション。 これらの事前構築されたソリューションは、「車輪の再発明」を防ぎ、頻繁に発生する問題に対する答えを提供します。 ただし、それらは万能ではありません。開発者は、特定のプロジェクトのニーズにパターンを適応させる必要があります。
デザイン パターンは、創造、構造、行動の 3 つのグループに分類され、それぞれに明確な特徴があります。この記事では、一般的な構造パターンであるプロキシ パターンに焦点を当てます。
プロキシ パターンを把握するには、次のシナリオを検討してください。ユーザー データにアクセスするには、まず別のサービス経由で JWT (JSON Web トークン) を取得する必要があります。
プロキシ パターンを使用しないと、各ユーザー データ リクエストに 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>
出力は、最初に 1 つの JWT のみが生成され、最初の JWT の有効期限が切れた後にのみ新しい JWT が生成されることを示しており、プロキシのキャッシュと検証の機能を示しています。
プロキシ パターンは、ソフトウェアの効率とセキュリティを強化します。 システム アーキテクチャと潜在的なボトルネックを慎重に検討することで、開発者はこのパターンを活用して、より堅牢で保守しやすいアプリケーションを作成できます。 パターンを特定のニーズに合わせて調整することを忘れないでください。 コーディングを楽しんでください! ❤️
以上がデザイン パターン シリーズ — 構造の章: プロキシ パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。