知识卡片
强制代理由真实角色自己管理代理的产生
内容
强制代理反转了[[普通代理要求调用方只知道代理、不知道真实角色]]的方向:即使调用方直接 new出真实角色或自己new代理,真实角色也会拒绝服务,唯一路径是调用真实角色自己的 getProxy()方法获取指定代理。实现上真实角色内部持有proxy引用并校验只有自己创建的代理 才放行。发散:这把”谁有权代表我”的决定权从调用方移交给被代理对象本身,适合必须严格 控制访问路径的高风险场景。
参考来源
- 位置:《设计模式之禅(第2版)》第12章《代理模式》(源文件:_epub-src/text/part0055.html)
- 结论依据:原文展示直接new真实角色和自行new代理角色均无法访问(打印"请使用指定的代理访问"),只有调用player.getProxy()获取真实角色指定的代理实例才能正常访问,说明"强制代理的概念就是要从真实角色查找到代理角色,不允许直接访问真实角色"。
- 原始内容:强制代理却是要"强制",你必须通过真实角色查找到代理角色,否则你不能访问……高层模块只要调用getProxy就可以访问真实角色的所有方法,它根本就不需要产生一个代理出来,代理的管理已经由真实角色自己完成。