代理模式定义
为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
代理模式使用场景
- 当需要隐藏一个类的时候;
- 可以在代理类中做访问委托类的权限管理;
- 当我们需要对委托类功能做拓展的时候也可以使用代理模式。
代理模式的优缺点
优点:
- 职责清晰,委托类只需关注自身功能实现,不需要非自身职责;
- 代理对象可以在客户端和目标对象之间起到中介作用,保护目标对象;
- 可拓展性更强。
缺点:
- 代理类的增加,会使系统文件增加,增加复杂度;
- 增加一层代理类,性能会有所损耗;
代理模式代码实现
<?php
namespace AppStructuralProxy;
interface ByHouseInterface
{
public function byHouse();
}
<?php
namespace AppStructuralProxy;
class TomByHouse implements ByHouseInterface
{
public function byHouse()
{
echo "tom by a house
";
}
}
<?php
namespace AppStructuralProxy;
class ByHousePorxy implements ByHouseInterface
{
protected $customer;
public function __construct(ByHouseInterface $customer)
{
$this->customer = $customer;
}
public function byHouse()
{
echo "by house before
";
$this->customer->byHouse();
echo "by house after
";
return 1;
}
}
<?php
class ProxyTest extends PHPUnitFrameworkTestCase
{
public function testByHouse()
{
$proxy = new AppStructuralProxyByHousePorxy(new AppStructuralProxyTomByHouse());
$this->assertEquals(1, $proxy->byHouse());
}
}