代理模式,为其它对象提供一种代理以控制对这个对象的访问。
第一段是自己想象的直接送礼代码,它的问题在于:Boy类中定义了Girl,就是说追求者直接“认识”了女孩。
第二段则是完全把书中的抄一遍。才发现其中关键的地方是:gg = new Pursuit(mm);代理者认识女孩,也认识追求者(不过这样,追求者还是认识女孩,即追求者中有女孩的类存在)。看来代理不是让追求者中不出现对女孩的引用,而只是控制追求者不能直接动作,而是通过代理者才能动作。因此,本质上,没有代理者,追求者完全可以正常地动作,代理者只是碍事的第三者。
碍事?那有什么好处?
原来,代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。如:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实(这一点我还没有很深的体会,虽然有例子“Web引用”,但我没用过,因此它还不算是例子);虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象(也是?);安全代理,用来控制真实对象访问时的权限;智能指引,是指当调用真实对象时,代理处理另外一些事,如计算真实对象的引用次数,或检查是否已经锁定它等等。
查看代理模式的标准代码,我们可以看出其实“娇娇”并不是代理模式的组成部分。
对我第一个直接送的代码改为代理的,关键是代理中有一个被代理的对象,我在代理构建时,就设置好。以后执行动作时,直接调用这个对象的相同动作。
现在再回头想一下,有没有可能让Boy类中都没有Girl类,然后送礼,由Proxy送到Girl中,虽然Boy根本没有Girl的映象,但它相信Proxy,不会把礼物送给阿猫阿狗,爱情“经纪人”模式。这样Boy就根本没有严格意义的送礼动作,只能是“Boy送出礼物”,然后“经纪人转给Girl”,这种模式应该如何实现?