7.4符合实际的代码
代码结构图:
代码实现:
代理接口如下
interface GiveGift
{
public function GiveDolls();
public function GiveFlowers();
public function GiveChocolate();
}
追求者类如下
//唯一变化就是让“追求者”去实现“送礼物”接口
class Pursuit implements GiveGift
{
protected $mm = null;
public function __construct($mm)
{
$this->mm = $mm;
}
public function GiveDolls()
{
echo $this->mm->Name() . '送你洋娃娃<br>';
}
public function GiveFlowers()
{
echo $this->mm->Name() . '送你鲜花<br>';
}
public function GiveChocolate()
{
echo $this->mm->Name() . '送你巧克力<br>';
}
}
被追求者类
class SchoolGirl
{
private $name = '';
public function __construct($name)
{
$this->name = $name;
}
public function Name()
{
return $this->name;
}
}
代理类如下
//让“代理”也去实现“送礼物”接口
class Proxy implements GiveGift
{
protected $gg = null;
public function __construct($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('李娇娇');
$daili = new Pursuit($jiaojiao);
$daili->GiveDolls();
$daili->GiveFlowers();
$daili->GiveChocolate();
7.5代理模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
代理模式(Proxy)结构图
代码示例:
Subject类,定义了Real Subject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
abstract class Subject
{
abstract function Request();
}
RealSubject类,定义Proxy所代表的真实实体。
class RealSubject extends Subject
{
public function Request()
{
echo '真实的请求';
}
}
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
class Proxy extends Subject
{
private $realRequest = null;
public function Request()
{
if ($this->realRequest == null) {
$this->realRequest = new RealSubject();
}
$this->realRequest->Request();
}
}
客户端代码
public function proxyDemo()
{
$proxy = new ProxyDemo();
$proxy->Request();
}
7.6代理模式应用
代理模式应用场景:
- 第一种应用,远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(WebService在.NET中的应用)
- 第二种应用,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。 (浏览器当中用代理模式来优化下载)
- 第三种应用,安全代理,用来控制真实对象访问时的权限。(一般用于对象应该有不同的访问权限的时候)
- 第四种应用,智能指引,是指当调用真实的对象时,代理处理另外一些事。(如计算机真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或者当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。)
代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。