🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 定义 给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 ### 作用 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 ### 使用场景 房东托中介卖房。 ### 优、缺点 优点: 1、职责清晰。 2、高扩展性。 3、智能化。 缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。 ### 模式结构 (略) ### 示例类图 代理模式包含几个角色: * Subject:抽象主题接口,定义了RealSubject和Proxy公用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。 * RealSubject:真正主题类,定义了Proxy所代表的真实实体。 * Proxy:代理对象,保存一个引用使得代理可以访问实体,并提供一个与RealSubject接口相同的接口,这样代理可以用来代替实体(RealSubject)。 :-: ![](https://box.kancloud.cn/253ae35d05c0cdd9e6d23b6b94af1ca7_518x258.bmp) ### 示例代码 * 抽象主题接口 (Subject) ``` /** * 房屋交易接口 */ interface HousingTransactions { public function sell(); } ``` * 真正主题类 (RealSubject) ``` /** * 房东卖房子 */ class Seller implements HousingTransactions { public $name; public function __construct($name) { $this->name = $name; } public function sell() { echo $this->name."卖房子\n"; } } ``` * 代理对象(Proxy) ``` /** * 房产中介 */ class Proxy implements HousingTransactions { private $_subject = null; public function __construct($name) { $this->_subject = new Seller($name); } public function sell() { $this->_subject->sell(); } } ``` * 客户端调用 ``` class Client { public static function main($argv) { $proxy = new Proxy('张三'); // 找中介帮忙卖房子 $proxy->sell(); $proxy = new Proxy('李四'); $proxy->sell(); } } Client::main($argv); ``` * 运行结果 ``` 张三卖房子 李四卖房子 ``` * * * * * ### 注意事项 1. 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2. 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。