代理模式其实生活中非常常见;在某些情况下,一个对象不合适或者不能直接调用另外一个对象,而代理对象可以在客户端和目标对象中起到中间人作用。
场景一:程序员A喜欢一个女生不敢表白;就请了B带话给了女生,这会好了程序员A成功抱的美人归。中间者可能会得到一下好处比如被请吃饭了。(现实没这么好的😄)
场景二:房产中介。一样的他们中间商赚差价,其实就是好处,代理模式经过了中间人代理,在系统代码级别上可以理解为性能消耗。
优点:职责清晰,委托类只需关注自身功能实现即可(比如给钱即可);可拓展性强,代理对象介于客户和目标中间起到了保护目标对象作用(比如拍卖一件古董,在代理那里会有各种验资等保护措施)
缺点:会使文件变多,性能损耗。
ByHouseInterface.php 文件
<?php
namespace App\Structural\Proxy;
interface ByHouseInterface
{
public function byHouse();
}
TomByHouse.php
<?php
namespace App\Structural\Proxy;
class TomByHouse implements ByHouseInterface
{
public function byHouse()
{
echo "tom by a house \r\n";
}
}
ByHousePorxy.php
<?php
namespace App\Structural\Proxy;
class ByHousePorxy implements ByHouseInterface
{
protected $customer;
public function __construct(ByHouseInterface $customer)
{
$this->customer = $customer;
}
public function byHouse()
{
echo "by house before \r\n";
$this->customer->byHouse();
echo "by house after \r\n";
return 1;
}
}
测试类
<?php
class ProxyTest extends \PHPUnit\Framework\TestCase
{
public function testByHouse()
{
$proxy = new \App\Structural\Proxy\ByHousePorxy(new \App\Structural\Proxy\TomByHouse());
$this->assertEquals(1, $proxy->byHouse());
}
}
代理类可以在实现目的的前后加上想要的操作:比如做日志等