以下文字部分均为本人自己的想法与总结所以未必正确;
代码摘自https://blog.csdn.net/rust94/article/details/88895465
代理模式:
概念: 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
适用场景:
- 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
- 开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
个人理解:
代理其实就是中间人。类比现实生活中的租房中介,具体的房子信息不用客户去收集,只要跟中介要就行了。当然,中介还可以在给你信息前对房屋信息进行一些包装美化(也就是在代理类中增加一些功能)
class SchoolGirl
{
private $name;
function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
// 代理接口
interface GiveGift
{
public function GiveDolls();
public function GiveFlowers();
public function GiveChocolate();
}
// 代理实现送礼物接口
class Proxy implements GiveGift
{
protected $pursuit;
function __construct(SchoolGirl $girl)
{
$this->pursuit = new Pursuit($girl);
}
public function GiveDolls()
{
echo "追求者XXX委托我给你送娃娃:" . PHP_EOL;
$this->pursuit->GiveDolls();
}
public function GiveFlowers()
{
echo "追求者XXX委托我给你送鲜花:" . PHP_EOL;
$this->pursuit->GiveFlowers();
}
public function GiveChocolate()
{
echo "追求者XXX委托我给你送巧克力:" . PHP_EOL;
$this->pursuit->GiveChocolate();
}
}
// 追求者类实现送礼物接口
class Pursuit implements GiveGift
{
protected $girl;
function __construct(SchoolGirl $girl)
{
$this->girl = $girl;
}
public function GiveDolls()
{
echo $this->girl->getName()." 送你娃娃\n";
}
public function GiveFlowers()
{
echo $this->girl->getName()." 送你花\n";
}
public function GiveChocolate()
{
echo $this->girl->getName()." 送你巧克力\n";
}
}
// 客户端代码
$girl = new SchoolGirl('李梅');
$proxy = new Proxy($girl);
$proxy->GiveDolls();
$proxy->GiveChocolate();
$proxy->GiveFlowers();