Javaのプロキシパターン

1. 概要

*プロキシパターンを使用すると、別のリソースへのインターフェイスとして機能する仲介者を作成できます*。また、コンポーネントの基礎となる複雑さを隠します。

2. プロキシパターンの例

初期設定が必要な重いJavaオブジェクト(JDBC接続や_SessionFactory_など)を検討してください。
このようなオブジェクトは必要に応じて初期化するだけで、一度初期化したら、すべての呼び出しに再利用したいと思います。
link:/uploads/MrvrsH6-300x140.jpg%20300w []
次に、このオブジェクトの簡単なインターフェイスと設定を作成しましょう。
public interface ExpensiveObject {
    void process();
}
そして、大規模な初期構成でのこのインターフェースの実装:
public class ExpensiveObjectImpl implements ExpensiveObject {

    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }

    @Override
    public void process() {
        LOG.info("processing complete.");
    }

    private void heavyInitialConfiguration() {
        LOG.info("Loading initial configuration...");
    }

}
ここで、プロキシパターンを利用し、オンデマンドでオブジェクトを初期化します。
public class ExpensiveObjectProxy implements ExpensiveObject {
    private static ExpensiveObject object;

    @Override
    public void process() {
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        object.process();
    }
}
クライアントが_process()_メソッドを呼び出すたびに、処理が表示されるだけで、初期構成は常に非表示のままになります。
public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}
_process()_メソッドを2回呼び出していることに注意してください。 舞台裏では、設定部分はオブジェクトが最初に初期化されるときに1回だけ発生します。
それ以降のすべての呼び出しでは、このパターンは初期構成をスキップし、処理のみが発生します。
Loading initial configuration...
processing complete.
processing complete.

3. プロキシを使用する場合

*パターンの使用方法*を理解することが重要です。
*いつ使用するかを理解することが重要です。
Proxyパターンをいつ使用するかについて話しましょう。
  • 複雑なオブジェクトや重いオブジェクトの簡易バージョンが必要な場合
    この場合、遅延初期化とも呼ばれる、要求に応じて元のオブジェクトをロードするスケルトンオブジェクトで表すことができます。 これは仮想プロキシとして知られています

  • 元のオブジェクトが異なるアドレス空間に存在する場合、および
    ローカルに表現したい
    。 接続、エンコード、デコードなどの作成と保守など、必要なすべての定型的なことを行うプロキシを作成できます。クライアントは、ローカルアドレス空間に存在していたものにアクセスします。 これはリモートプロキシと呼ばれます

  • 元の基盤にセキュリティレイヤーを追加する場合
    クライアントのアクセス権に基づいて制御されたアクセスを提供するオブジェクト
    。 これは保護プロキシと呼ばれます

4. 結論

この記事では、プロキシ設計パターンを見てみました。 これは、次の場合に適しています。
  • オブジェクトの簡易バージョンを使用したり、
    より安全にオブジェクト

  • リモートオブジェクトのローカルバージョンが必要な場合

    この例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/patterns/design-patterns-structural[over on GitHub]で入手できます。