php與設(shè)計模式-代理模式

代理模式

為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。

Demo

/**
 * Interface Subject 抽象主題角色
 *
 * 定義RealSubject和Proxy共同具備的東西
 */
interface Subject
{
    public function say();
    public function run();
}
 
/**
 * Class RealSubject 真正主題角色
 */
class RealSubject implements Subject
{
    // 姓名
    private $_name;
 
    /**
     * RealSubject constructor. 構(gòu)造方法
     *
     * @param $name
     */
    public function __construct($name)
    {
        $this->_name = $name;
    }
 
    /**
     * 說話
     */
    public function say()
    {
        echo $this->_name."在說話<br>";
    }
 
    /**
     * 在跑步
     */
    public function run(){
        echo $this->_name."在跑步<br>";
    }
}
 
/**
 * Class Proxy 代理對象
 */
class Proxy implements Subject
{
    // 真實主題對象
    private $_realSubject = null;
 
    /**
     * Proxy constructor. 構(gòu)造方法,依賴注入方式儲存真實對象
     *
     * @param RealSubject|null $realSubject
     */
    public function __construct(RealSubject $realSubject = null)
    {
        if (empty($realSubject)) {
            $this->_realSubject = new RealSubject();
        } else {
            $this->_realSubject = $realSubject;
        }
    }
 
    /**
     * 調(diào)用說話方法
     */
    public function say()
    {
        $this->_realSubject->say();
    }
 
    /**
     * 調(diào)用跑步方法
     */
    public function run()
    {
        $this->_realSubject->run();
    }
}
 
/**
 * Class Client 本地測試
 */
class Client
{
    public static function test()
    {
        // 創(chuàng)建
        $subject = new RealSubject("張三");
        // 代理
        $proxy = new Proxy($subject);
        // 張三在說話
        $proxy->say();
        // 張三在跑步
        $proxy->run();
    }
}
 
// 測試
Client::test();

請關(guān)注我的訂閱號

訂閱號.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容