代理模式
一、场景分析
现在有如下场景:隔壁3班有个女孩叫娇娇,长的很漂亮。1班的卓贾易想追娇娇,但是又和娇娇不熟,所以让同班的与娇娇比较熟的戴立去帮忙送花送玩具,以此来赢得娇娇的芳心。
那么其实戴立做的事情就是帮卓贾易将礼物送到娇娇手里。
二、什么是代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
三、适用场景
1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
3. 安全代理,用来控制真实对象访问时的权限
4. 智能指引,是指当调用真实的对象时,代理处理另外一些事
四、代码实现
//送礼物接口 interface GiveGift { public function giveDolls(); public function giveFlowers(); } //追求者类 class Pursuit implements GiveGift { private $name; private $beauty; public function __construct($name,Beauty $beauty) { $this->name = $name; $this->beauty = $beauty; } public function giveDolls() { echo $this->name.'给'.$this->beauty->getName().'送玩具'.PHP_EOL; } public function giveFlowers() { echo $this->name.'给'.$this->beauty->getName().'送鲜花'.PHP_EOL; } } //美眉类 class Beauty { private $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } //代理类 class Proxy implements GiveGift { private $pursuit; private $name; public function __construct($name,Pursuit $pursuit) { $this->name = $name; $this->pursuit = $pursuit; } private function introduct() { echo '我是'.$this->name.',我来替'; } public function giveDolls() { $this->introduct(); $this->pursuit->giveDolls(); } public function giveFlowers() { $this->introduct(); $this->pursuit->giveFlowers(); } } $jiaojiao = new Beauty('娇娇'); $zhojiayi = new Pursuit('卓贾易',$jiaojiao); $daili = new Proxy('戴立',$zhojiayi); $daili->giveDolls(); $daili->giveFlowers();
五、优缺点
优点:
1、职责清晰。
2、高扩展性。
3、智能化。
缺点:
1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
六、UML图