php设计模式(十七)代理模式

代理模式我们可能不熟悉;
但是代理我们大多数程序猿都应该用过;
比如说为了翻过一堵墙用谷歌查找资料;
或者现实中购买商品我们也不是直接去工厂;
而是通过一层层的代理商;

结构

Subject:主题接口;定义真实主题和代理的公共方法;
RealSubject:实现主题接口的真实主题;隐藏在代理之后;
Proxy:实现主题接口并在内部引用了真实的主题;

示例

Subject.php

<?php

namespace Baijunyao\DesignPatterns\Proxy;

/**
 * 
 *
 * Interface Subject
 *
 * @package Baijunyao\DesignPatterns\Proxy
 */
interface Subject
{
    public function action();
}

RealSubject.php

<?php

namespace Baijunyao\DesignPatterns\Proxy;

/**
 * 真实主题
 *
 * Class RealSubject
 *
 * @package Baijunyao\DesignPatterns\Proxy
 */
class RealSubject implements Subject
{
    /**
     * 执行操作
     */
    public function action()
    {
        echo '执行操作';
    }
}

Proxy.php

<?php

namespace Baijunyao\DesignPatterns\Proxy;

/**
 * 代理
 *
 * Class Proxy
 *
 * @package Baijunyao\DesignPatterns\Proxy
 */
class Proxy implements Subject
{
    /**
     * 真实主题
     *
     * @var \Baijunyao\DesignPatterns\Proxy\RealSubject
     */
    protected $realSubject;

    /**
     * Proxy constructor.
     */
    public function __construct()
    {
        $this->realSubject = new RealSubject();
    }

    /*
     * 执行操作
     */
    public function action()
    {
        $this->realSubject->action();
    }

}

运行;
index.php

<?php

namespace Baijunyao\DesignPatterns\Proxy;

require __DIR__.'/../vendor/autoload.php';

/**
 * 客户端
 *
 * Class Client
 * @package Baijunyao\DesignPatterns\Proxy
 */
class Client
{
    /**
     * 运行
     */
    public function run()
    {
        $proxy = new Proxy();
        $proxy->action();
    }
}

$client = new Client();
$client->run();

因为我们在客户端和真实的主题间加了一层代理;
那么我们就可以做很多事情了;
比如说可以在不修改真实代理的情况下做一些权限控制;

github示例:https://github.com/baijunyao/design-patterns/tree/master/Proxy

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共4条评论
白俊遥博客

Akali 白俊遥博客

2018-12-24 15:34:57 回复

白俊遥博客

星辰大海 :其实代理也好理解,好比路由器与我们电脑就是一个代理模式

2018-11-21 10:27:15 回复

白俊遥博客

小六HI :设计模式太多了,这些不常用的也不行学咋办。

2018-10-31 11:16:53 回复

白俊遥博客

zhaokeli :试试留言功能

2019-03-10 09:28:31 回复