2

最近、デザイン パターンについて読んでいますが、プロキシ パターンについて理解できないことがあります。

本からの引用:

  1. 仮想プロキシは、高価なオブジェクトをオンデマンドで作成します。動機で説明されている ImageProxy は、そのようなプロキシの例です。

このパターンを使用して、高価なオブジェクトをオンデマンドで作成できることがわかりました。また、この例も使用法を非常によく示しています。

以下は、プロキシされたクラスのコンストラクターですRealImage。メソッドloadFromDisk()は、コストのかかる手順を示します。

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

そして、この例ProxyImageのプロキシ クラスは、意図した通りのことを行います。つまり、高価なオブジェクトをオンデマンドで作成します。

しかし、私の質問は、コンストラクターから高価なメソッドを削除して、loadFromDisk()絶対に必要な場所に配置できないのはなぜですか?

ここみたいに?

  public void display() {
      if(!loaded){
          loadFromDisk(fileName);
          loaded = true;
      }
      //then display
   }

では、なぜわざわざプロキシを使用するのでしょうか?

4

1 に答える 1

1

この状況でプロキシ パターンが解決する問題は、コードの重複です。フラグをチェックする必要があるdisplay()場所と同様のメソッドが多数ある状況を想像してください。loadedコードは次のようになります。

public void display() {
    if(!loaded){
        loadFromDisk(fileName);
        loaded = true;
    }
    //then display
}
public void resize(double scale) {
    if(!loaded){
        loadFromDisk(fileName);
        loaded = true;
    }
    //then resize
}
... // more methods go here
public void save() {
    if(!loaded){
        loadFromDisk(fileName);
        loaded = true;
    }
    //then save
}

コードをメソッドに入れてif(!loaded){...すべてのメソッドから呼び出す場合でも、呼び出しを実行することを忘れないでください。これはエラーが発生しやすく、特にプロジェクトに参加する新しいプログラマーにとって、将来的に問題が発生する可能性があります。

于 2016-02-21T02:04:46.167 に答える