---------------------------------------------------------
简述
代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问。为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。
根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。
举例理解
- 代购。代购电子产品,代购化妆品,代购网站,等等,这些代购行为对应的设计模式便是代理模式。
- 中介。房产中介,金融中介,劳务中介,等等,这些中介实现的功能也是代理模式。
结构
实现思路
- 代理对象和目标对象均实现同一个行为接口。
- 代理类和目标类分别具体实现接口逻辑。
- 在代理类的构造函数中实例化一个目标对象。
- 在代理类中调用目标对象的行为接口。
- 客户端想要调用目标对象的行为接口,只能通过代理类来操作。
示例-静态代理
- 场景:房屋租赁
- 角色:租客,房产中介,房东
- 描述:租客无法直接找到(访问)房东,所以找到房产中介这个代理来租房。房产中介代理了房东的房产,和房东共同拥有出租房屋这个功能。除此之外,房产中介可能还会提供更多的服务(方法)。
// 房屋租赁
interface house
{
public function rent();
}
// 房东
class owner implements house
{
public function rent()
{
echo '房东出租房屋' . PHP_EOL;
}
}
// 房产中介
class agent implements house
{
// 持有一个被代理者的引用
private $owner;
public function __construct()
{
$this->owner = new owner;
}
public function rent()
{
echo '房产中介带看房' . PHP_EOL;
$this->owner->rent();
echo '房产中介保洁一次' . PHP_EOL;
}
}
// 实例化一个中介
$agent = new agent;
// 租赁
$agent->rent();
输出:
房产中介带看房
房东出租房屋
房产中介保洁一次
优点
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
- 远程代理使得客户端可以访问在远程机器上的对象,隐藏一个对象存在于不同地址空间,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
- 保护代理可以控制对真实对象的使用权限。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。