设计模式-代理模式

31 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

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

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

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

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