关于这个模式暂时理解的不深,直接上代码吧。
常规的代理模式的uml类图如下所示:
从上图中可以看出client需要调用realsubject类的服务,proxy类其实充当的是一个中介的角色。至于为什么要加上这样一层中间的代理,暂时不理解,如果有了解的朋友可以文章的下方评论区提出,不胜感激。
代理模式的官方定义是:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
写了一个男生追女生的案例帮助理解,
Girl.php
<?php
class Girl{
private $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
}
Boy.php
<?php
require_once 'GiveGift.php';
class Boy implements GiveGift{
public $girl;
public function __construct(Girl $girl){
$this->girl = $girl;
}
public function giveBook(){
echo $this->girl->getName().',送你一本书';
}
public function giveLetter(){
echo $this->girl->getName().',送你一封信';
}
public function giveFolower(){
echo $this->girl->getName().',送你一朵书';
}
}
Roommate.php
<?php
require_once 'GiveGift.php';
class Roommate implements GiveGift{
public $boy;
public function __construct(GiveGift $boy){
$this->boy = $boy;
}
public function giveBook(){
$this->boy->giveBook();
}
public function giveLetter(){
$this->boy->giveLetter();
}
public function giveFolower(){
$this->boy->giveFolower();
}
}
GiveGift.php
<?php
interface GiveGift{
public function giveBook();
public function giveLetter();
public function giveFolower();
}
index.php
<?php
require 'Girl.php';
require 'Boy.php';
require 'Roommate.php';
//其实这里面的韩梅梅就是真实需要请求的服务
$realSubject = new Girl('韩梅梅');
//男孩就是客户端
$client = new Boy($realSubject);
//女孩的室友就是一个中介代理
$proxy = new Roommate($client);
$proxy->giveBook();
$proxy->giveLetter();
$proxy->giveFolower();
代码可以从这个地址下载:http:://www.walk-sing.com/