0

私は次の質問の答えを調べていました:

プロキシ パターンの短所

答えの1つは次のとおりです。

ランタイム環境はプロキシ オブジェクトをいじる可能性があり、プロキシ自体とその背後に隠れているビジネス オブジェクトを誤って比較しようとするリスクが常にあります。比較すると、ランタイムから戻って見えます(そしてプロキシを取得します)。

誰でもこれを詳しく説明できますか?(私はこの行を 1000 回読みましたが、これを理解できませんでした)。

4

1 に答える 1

1

次のサービス インターフェイスがあるとします。

public interface Phone {
    void call(String number, PhoneListener listener);
}

そして具体的な実装:

public class PhoneImpl implements Phone 

    @Override
    public void call(String number, PhoneListener listener) {
        // perform the phone call
        // chat
        // tell the listener that the call is complete
        listener.callEnded(this);
    }
}

ここで、クラスがあるファクトリから 2 つのインスタンスを取得し、このファクトリが実際にプロキシを返すとします。これは、すべての通話がこのプロキシによって記録される必要があるためです。

public class PhoneHouse {
     public static void main(String[] args) {
         Phone phone1 = PhoneFactory.getPhone("phone1");
         Phone phone2 = PhoneFactory.getPhone("phone2");
         PhoneListener listener = new PhoneListener() {
             @Override
             public void callEnded(Phone phone) {
                 if (phone.equals(phone1)) {
                     System.out.println("A call ended with phone 1");
                 }
                 else if (phone.equals(phone2)) {
                     System.out.println("A call ended with phone 2");
                 }
             }
         };
         phone1.call("012345678", listener);
         phone2.call("098765432", listener);
     }
}

さて、画面には何が表示されるでしょうか?

リスナーのcallEnded()メソッドに渡される電話はインスタンスPhoneImplですが、phone1phone2のインスタンスをラップするプロキシであるため、答えは何もありませんPhoneImpl

于 2013-08-18T14:54:56.547 に答える