PHP 디자인 패턴 프록시 패턴

高洛峰
풀어 주다: 2016-11-21 14:41:40
원래의
1142명이 탐색했습니다.

개념

프록시 패턴: 객체 구조 패턴. 객체에 대한 프록시를 제공하면 프록시 객체가 원본 객체에 대한 참조를 제어합니다.

UML

PHP 디자인 패턴 프록시 패턴

Role

추상 주체 역할(Subject): RealSubject를 사용할 수 있도록 RealSubject 및 Proxy 공용 인터페이스를 정의합니다. 어디서나 프록시를 어디에서나 사용할 수 있습니다.

실제 주체 역할(RealSubject): Proxy가 나타내는 실제 엔터티를 정의합니다.

프록시 객체(Proxy): 프록시가 엔터티에 접근할 수 있도록 참조를 저장하고, 엔터티(RealSubject) 대신 프록시를 사용할 수 있도록 RealSubject 인터페이스와 동일한 인터페이스를 제공합니다.

적용 가능한 시나리오

프록시 모드를 사용하는 목적에 따라 일반적인 프록시 모드에는 다음과 같은 유형이 있습니다.

원격 프록시: 다른 주소 공간에 위치한 프록시 개체는 로컬 프록시 개체를 제공합니다. 이 다른 주소 공간은 동일한 호스트 또는 다른 호스트에 있을 수 있습니다. 원격 프록시를 대사라고도 합니다.

가상 프록시: 많은 양의 리소스를 소비하는 개체를 만들어야 하는 경우 먼저 이를 표현하기 위해 상대적으로 적은 양의 리소스를 소비하는 개체를 만듭니다. 실제 개체는 필요할 때만 생성됩니다.

기록 중 복사 에이전트: 클라이언트가 실제로 필요할 때만 실행될 때까지 복사(복제) 작업을 지연시키는 일종의 가상 에이전트입니다. 일반적으로 객체의 심층 복제는 비용이 많이 드는 작업입니다. Copy-on-Write 프록시는 이 작업을 지연시킬 수 있으며 객체는 사용될 때만 복제됩니다.

보호 또는 액세스 에이전트: 개체에 대한 액세스를 제어하고 사용자마다 다양한 수준의 사용 권한을 제공할 수 있습니다.

캐시 에이전트: 특정 대상 작업의 결과를 여러 클라이언트가 공유할 수 있도록 임시 저장 공간을 제공합니다.

방화벽 프록시: 악의적인 사용자로부터 대상을 보호합니다.

동기화 에이전트: 여러 사용자가 충돌 없이 동시에 개체를 사용할 수 있도록 합니다.

스마트 참조 에이전트: 개체가 참조되면 이 개체가 호출된 횟수를 기록하는 등 몇 가지 추가 작업을 제공합니다.

코드

코드는 다음과 같습니다.

<?php
header("Content-type:text/html;Charset=utf-8");

/**
 * Interface Subject 抽象主题角色
 *
 * 定义RealSubject和Proxy共同具备的东西
 */
interface Subject
{
    public function say();
    public function run();
}

/**
 * Class RealSubject 真正主题角色
 */
class RealSubject implements Subject
{
    // 姓名
    private $_name;

    /**
     * RealSubject constructor. 构造方法
     *
     * @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. 构造方法,依赖注入方式储存真实对象
     *
     * @param RealSubject|null $realSubject
     */
    public function __construct(RealSubject $realSubject = null)
    {
        if (empty($realSubject)) {
            $this->_realSubject = new RealSubject();
        } else {
            $this->_realSubject = $realSubject;
        }
    }

    /**
     * 调用说话方法
     */
    public function say()
    {
        $this->_realSubject->say();
    }

    /**
     * 调用跑步方法
     */
    public function run()
    {
        $this->_realSubject->run();
    }
}

/**
 * Class Client 本地测试
 */
class Client
{
    public static function test()
    {
        // 创建
        $subject = new RealSubject("张三");
        // 代理
        $proxy = new Proxy($subject);
        // 张三在说话
        $proxy->say();
        // 张三在跑步
        $proxy->run();
    }
}

// 测试
Client::test();
로그인 후 복사

실행 결과:

장삼이 말하고 있습니다
장삼이 달리고 있습니다

장점 및 단점

장점:

프록시 모드는 발신자와 수신자를 조정할 수 있어 시스템 결합을 어느 정도 줄일 수 있습니다.

원격 프록시를 사용하면 클라이언트가 원격 시스템의 개체에 액세스할 수 있습니다. 원격 시스템은 더 나은 컴퓨팅 성능과 처리 속도를 가지며 클라이언트 요청에 빠르게 응답하고 처리할 수 있습니다.

가상 에이전트는 작은 개체를 사용하여 큰 개체를 표현함으로써 시스템 리소스 소비를 줄이고 시스템을 최적화하며 실행 속도를 높일 수 있습니다.

보호 에이전트는 실제 개체에 대한 접근을 제어합니다.

단점:

클라이언트와 실제 주제 사이에 프록시 개체가 추가되기 때문에 일부 유형의 프록시 모드에서는 요청 처리 속도가 느려질 수 있습니다.

프록시 패턴을 구현하려면 추가 작업이 필요하며 일부 프록시 패턴의 구현은 매우 복잡합니다.


관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿