设计模式-代理模式

来源:互联网 发布:淘宝店铺后花园 编辑:程序博客网 时间:2024/06/15 01:32

案例:卓贾易拜托戴励给娇娇送礼物,追求娇娇

小菜的第一版代码(没有代理的代码):

//追求者类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了,娇娇不认识追求她的卓贾易,但是却通过代理人戴励(娇娇认识的)得到礼物。

=============================

注:
代理模式:为其他对象提供一种代理以控制对这个对象的访问。

原创粉丝点击