개념
프록시 패턴: 객체 구조 패턴. 객체에 대한 프록시를 제공하면 프록시 객체가 원본 객체에 대한 참조를 제어합니다.
UML
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();
실행 결과:
장삼이 말하고 있습니다
장삼이 달리고 있습니다
장점 및 단점
장점:
프록시 모드는 발신자와 수신자를 조정할 수 있어 시스템 결합을 어느 정도 줄일 수 있습니다.
원격 프록시를 사용하면 클라이언트가 원격 시스템의 개체에 액세스할 수 있습니다. 원격 시스템은 더 나은 컴퓨팅 성능과 처리 속도를 가지며 클라이언트 요청에 빠르게 응답하고 처리할 수 있습니다.
가상 에이전트는 작은 개체를 사용하여 큰 개체를 표현함으로써 시스템 리소스 소비를 줄이고 시스템을 최적화하며 실행 속도를 높일 수 있습니다.
보호 에이전트는 실제 개체에 대한 접근을 제어합니다.
단점:
클라이언트와 실제 주제 사이에 프록시 개체가 추가되기 때문에 일부 유형의 프록시 모드에서는 요청 처리 속도가 느려질 수 있습니다.
프록시 패턴을 구현하려면 추가 작업이 필요하며 일부 프록시 패턴의 구현은 매우 복잡합니다.