关于代理权平等的查询

时间:2013-08-18 14:01:46

标签: java design-patterns proxy

我正在查看以下问题的答案:

Proxy Pattern Cons

其中一个答案是:

  

运行时环境可能会使用代理对象,并且   你总是冒着不小心试图比较代理的风险   本身隐藏在它后面的业务对象,就像在哪里   该对象将此引用传递到某个地方并且有人在尝试   比较它从运行时查找备份(并获取代理)。

任何人都可以详细说明这个吗?(我已经读了1000行但却无法理解这一点。)

1 个答案:

答案 0 :(得分: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);
    }
}

现在假设一个类从某个工厂获取两个实例,并且该工厂实际上返回一个代理,因为该代理应该记录每个电话:

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是包含{{1}实例的代理1}}。