案例:卓贾易拜托戴励给娇娇送礼物,追求娇娇
小菜的第一版代码(没有代理的代码):
//追求者类
class Pursuit {
public $mm;
public function __construct(SchoolGirl $mm)
{
$this->mm = $mm;
}
public function GiveDolls()
{
echo "{$this->mm->GetName()} 送你洋娃娃\n";
}
public function GiveFlowers()
{
echo "{$this->mm->GetName()} 送你鲜花\n";
}
public function GiveChocolate()
{
echo "{$this->mm->GetName()} 送你巧克力\n";
}
}
//被追求者类
class SchoolGirl {
private $name;
public function SetName($name)
{
$this->name = $name;
}
public function GetName()
{
return $this->name;
}
}
//客户端代码
$jiaojiao = new SchoolGirl();
$jiaojiao->SetName("李娇娇");
$zhuojiayi = new Pursuit($jiaojiao);
$zhuojiayi->GiveDolls();
$zhuojiayi->GiveFlowers();
$zhuojiayi->GiveChocolate();
此版代码有个问题,$zhuojiayi = new Pursuit($jiaojiao);
这里娇娇并不认识卓贾易。
小菜的第二版代码(只有代理的代码):
//被追求者类
class SchoolGirl {
private $name;
public function SetName($name)
{
$this->name = $name;
}
public function GetName()
{
return $this->name;
}
}
//代理类
class Proxy {
public $mm;
public function __construct(SchoolGirl $mm)
{
$this->mm = $mm;
}
public function GiveDolls()
{
echo "{$this->mm->GetName()} 送你洋娃娃\n";
}
public function GiveFlowers()
{
echo "{$this->mm->GetName()} 送你鲜花\n";
}
public function GiveChocolate()
{
echo "{$this->mm->GetName()} 送你巧克力\n";
}
}
//客户端代码
$jiaojiao = new SchoolGirl();
$jiaojiao->SetName("李娇娇");
$daili = new Proxy($jiaojiao);
$daili->GiveDolls();
$daili->GiveFlowers();
$daili->GiveChocolate();
此版代码还是有问题,$daili = new Proxy($jiaojiao);
虽然送花的变成了戴励,但是没有了卓贾易什么事了,变成戴励直接追娇娇了。
小菜的第三版代码:
//代理送礼物接口
interface IGiveGift {
public function GiveDolls();
public function GiveFlowers();
public function GiveChocolate();
}
//被追求者类
class SchoolGirl {
private $name;
public function SetName($name)
{
$this->name = $name;
}
public function GetName()
{
return $this->name;
}
}
//追求者类
class Pursuit implements IGiveGift {
public $mm;
public function __construct(SchoolGirl $mm)
{
$this->mm = $mm;
}
public function GiveDolls()
{
echo "{$this->mm->GetName()} 送你洋娃娃\n";
}
public function GiveFlowers()
{
echo "{$this->mm->GetName()} 送你鲜花\n";
}
public function GiveChocolate()
{
echo "{$this->mm->GetName()} 送你巧克力\n";
}
}
//代理类
class Proxy implements IGiveGift {
public $gg;
public function __construct(SchoolGirl $mm)
{
$this->gg = new Pursuit($mm);
}
public function GiveDolls()
{
$this->gg->GiveDolls();
}
public function GiveFlowers()
{
$this->gg->GiveFlowers();
}
public function GiveChocolate()
{
$this->gg->GiveChocolate();
}
}
//客户端代码
$jiaojiao = new SchoolGirl();
$jiaojiao->SetName("李娇娇");
$daili = new Proxy($jiaojiao);
$daili->GiveDolls();
$daili->GiveFlowers();
$daili->GiveChocolate();
这样就ok了,娇娇不认识追求她的卓贾易,但是却通过代理人戴励(娇娇认识的)得到礼物。
=============================
注:
代理模式:为其他对象提供一种代理以控制对这个对象的访问。