<?php
/**
* 2.7 代理模式
* 定义:
* 为其他对象提供一种代理以控制对这个对象的访问。
* 角色:
* 1. 代理抽象角色
* 职责:统一代理和被代理角色接口
* 2. 被代理角色
* 职责:
* 3. 代理角色
* 职责:代理角色2,并对角色2进行访问控制.
* 优点:
* 1. 职责清晰
* 2. 高扩展性
* 3. 智能化
* 缺点:
* 1. 由于客户端和真实主题之家增加了代理对象,因此有些
* 类型的代理模式可能会造成请求的处理速度慢。
* 2. 实现代理模式需要额外,有些代理模式的实现非常复杂
* 使用场景:
* 1. 远程代理
* 2. 虚拟代理
* 3. 安全代理
* 4. 智能指引
*/
header('content-type:text/html;charset=utf8');
//被追求者类
class SchoolGirl{
private $name;
public function __construct($name){
$this->name=$name;
}
public function getName(){
return $this->name;
}
}
//代理接口。针对接口编程,符合了依赖倒转原则。
abstract class GiveGift{
abstract public function giveDolls();
abstract public function giveFlowers();
abstract public function giveChocolate();
}
//追求者类
class Pursuit extends GiveGift{
private $mm;
public function __construct(SchoolGirl $mm){
$this->mm=$mm;
}
public function giveDolls(){
echo $this->mm->getName().'送你洋娃娃';
}
public function giveFlowers(){
echo $this->mm->getName().'送你鲜花';
}
public function giveChocolate(){
echo $this->mm->getName().'送你巧克力';
}
}
//代理者,它与追求者的功能(方法)一样,只不过起到了一个
//代理的作用,实际的东西(功能)依然是追求者的。代理者
//送的东西依然是追求者的。
class Proxy extends GiveGift{
private $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();
}
}
//客户端
$proxy1=new Proxy(new SchoolGirl('韩梅梅'));
$proxy1->giveDolls();
echo '<br/>';
$proxy1->giveFlowers();
echo '<br/>';
$proxy1->giveChocolate();
转载于:https://blog.51cto.com/noican/1614782