2017-05-20 2 views
0

私はプロキシパターンを理解しようとしています。クライアントがプロキシデザインパターンでプロキシオブジェクトを使用するようにする方法

プロキシが実際のオブジェクトと同じインターフェイスを実装する場合、クライアントが実際のオブジェクトではなくプロキシを使用するようにするにはどうすればよいですか?そのため、実際のオブジェクトのインスタンスをインターフェイスの参照に割り当て、メソッドを直接呼び出して、プロキシを迂回させることができます。

おそらく私はそれを得ていません。このパターンは、クライアントがプロキシとだけやり取りすることを保証するために使用されていませんか?

これは私が制御するコードで使用するパターンですか?

EDIT

public final class RealClass implements CommonInterfaceForProxyAndRealClasses { 

    private String name; 
    private String name2; 

    RealClass() { 
     // TODO Auto-generated constructor stub 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public String getName2() { 
     return name2; 
    } 

    public void setName2(final String name2) { 
     this.name2 = name2; 
    } 

    @Override 
    public String allowedMethodGetName() { 
     // TODO Auto-generated method stub 
     return getName() + getName2(); 
    } 
} 

public class ProxyForRealClasses 
     implements CommonInterfaceForProxyAndRealClasses { 

    @Override 
    public String allowedMethodGetName() { 
     final RealClass classy = new RealClass(); 
     classy.setName("hello"); 
     classy.setName2("new"); 
     return classy.allowedMethodGetName(); 
    } 

} 


final CommonInterfaceForProxyAndRealClasses myobje = new ProxyForRealClasses(); 
System.out.println(myobje.allowedMethodGetName()); 

// Shouldn't be possible 
final CommonInterfaceForProxyAndRealClasses myobje2 = new RealClass(); 
System.out.println(myobje2.allowedMethodGetName()); 
+0

実際のオブジェクトが保護作り、プロキシパブリック。 – rossum

+0

問題を示すサンプルコードがありますか – Julian

+0

@Julian私の編集を参照してください。私は今いくつかのコードを提供しました。 – user3813234

答えて

1

それは本当にあなたがコードの上に持っているどのくらいの制御に依存しますが、ここではあなたのサンプルコードに基づいて、一例であり、これは直接両方のクラスのinstantationを妨げる:

public final class ProxyExample { 
    public interface CommonInterfaceForProxyAndRealClasses { 
     String allowedMethodGetName(); 
    } 

    private static final class RealClass implements CommonInterfaceForProxyAndRealClasses { 

     private String name; 
     private String name2; 

     RealClass() { 
      // TODO Auto-generated constructor stub 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(final String name) { 
      this.name = name; 
     } 

     public String getName2() { 
      return name2; 
     } 

     public void setName2(final String name2) { 
      this.name2 = name2; 
     } 

     @Override 
     public String allowedMethodGetName() { 
      // TODO Auto-generated method stub 
      return getName() + getName2(); 
     } 
    } 

    private static final class ProxyForRealClasses 
      implements CommonInterfaceForProxyAndRealClasses { 
     private final CommonInterfaceForProxyAndRealClasses target; 
     public ProxyForRealClasses(CommonInterfaceForProxyAndRealClasses target) { 
      this.target = target; 
     } 
     @Override 
     public String allowedMethodGetName() { 
      return target.allowedMethodGetName(); 
     } 
    } 

    public static CommonInterfaceForProxyAndRealClasses getProxiedObjectWithName(String name1, String name2) { 
     RealClass realClass = new RealClass(); 
     realClass.setName(name1); 
     realClass.setName2(name2); 
     return new ProxyForRealClasses(realClass); 
    } 
} 
+0

すばらしい、例のおかげで! – user3813234

1

は、どのように私は、クライアントがプロキシではなく実際のオブジェクトを使用して確認することができますか?

カプセル化されています。実際のオブジェクトをプライベートフィールドとして非表示にすると、クライアントはそれをアクセスできなくなります。

このパターンは、クライアントがプロキシとのやり取りのみを確実に行うために使用されていませんか?

それ以上です。プロキシは、基盤となるオブジェクトのサンドボックス(セキュリティレイヤーを追加する)として使用できます。プロキシを使用してリモートサーバーで実行されるリモートオブジェクトにアクセスしたり、プロキシを使用して実際のオブジェクトにいくつかの要求をキャッシュしたり、

リモートオブジェクトのプロキシの場合、機能を提供する基礎となるオブジェクトの実装は、同じ物理マシン内にある必要はありません。この場合、プロキシは、参照されるオブジェクト、呼び出されるメソッド、およびパラメータに関する情報を含むネットワークメッセージ内のメソッド呼び出しを変換する責任を負う。

関連する問題