프록시 모드
프록시 패턴에서 한 클래스는 다른 클래스의 기능을 나타냅니다. 이러한 유형의 디자인 패턴은 구조적 패턴입니다.
프록시 패턴에서는 외부 세계에 기능적 인터페이스를 제공하기 위해 기존 객체로 객체를 생성합니다.
Introduction
의도: 이 개체에 대한 액세스를 제어하려면 다른 개체에 대한 프록시를 제공하세요.
주요 해결 방법: 객체에 직접 액세스할 때 발생하는 문제(예: 액세스할 객체가 원격 시스템에 있음). 객체 지향 시스템에서 일부 객체에 직접 접근하면 특정 이유로 인해 사용자나 시스템 구조에 많은 문제가 발생합니다(예: 객체 생성 비용이 많이 들거나 특정 작업에 보안 제어가 필요하거나 프로세스 외부가 필요함). access) 이 개체에 액세스할 때 이 개체에 액세스 레이어를 추가할 수 있습니다.
사용 시기: 수업에 액세스할 때 어느 정도 제어권을 갖고 싶습니다.
해결 방법: 중간 레이어를 추가하세요.
키 코드: 구현 및 프록시 클래스 조합.
응용 사례: 1. 2. Zhu Bajie가 Gao Cuilan을 찾으러 갔을 때 그는 Sun Wukong으로 밝혀졌습니다. Gao Cuilan의 모습이 추상화되었으며 Zhu Bajie가 Gao Cuilan을 방문했을 때 Sun Wukong이 이 인터페이스를 구현했습니다. 그는 이것이 Sun Wukong인지 알 수 없었기 때문에 Sun Wukong은 Gao Cuilan 요원 클래스라고 합니다. 3. 기차표를 기차역에서 살 필요 없이 대리점에 가셔도 됩니다. 4. 수표 또는 은행 예금 증명서는 계좌 자금의 대리인입니다. 수표는 시장 거래에서 현금 대신 사용되며 발행자의 계좌에 보관된 자금을 통제할 수 있습니다. 5. 스프링 AOP.
장점: 1. 명확한 책임. 2. 높은 확장성. 3. 지능적.
단점: 1. 클라이언트와 실제 주제 사이에 프록시 개체가 추가되어 일부 유형의 프록시 모드에서는 요청 처리 속도가 느려질 수 있습니다. 2. 프록시 모드를 구현하려면 추가 작업이 필요하며 일부 프록시 모드의 구현은 매우 복잡합니다.
사용 시나리오: 책임별로 구분하면 일반적으로 다음과 같은 사용 시나리오가 있습니다. 1. 원격 에이전트. 2. 가상 에이전트. 3. 기록 중 복사 에이전트. 4. 에이전트를 보호(보호 또는 액세스)합니다. 5. 캐시 에이전트. 6. 방화벽 프록시. 7. 동기화 에이전트. 8. 스마트 참조 에이전트.
참고: 1. 어댑터 패턴과 어댑터 패턴의 차이점: 어댑터 패턴은 주로 고려 중인 개체의 인터페이스를 변경하는 반면 프록시 패턴은 프록시 클래스의 인터페이스를 변경할 수 없습니다. 2. 데코레이터 모드와 데코레이터 모드의 차이점: 데코레이터 모드는 기능을 향상시키는 것이고 프록시 모드는 기능을 제어하는 것입니다.
Implementation
Image 인터페이스와 Image 인터페이스를 구현하는 엔터티 클래스를 생성하겠습니다. ProxyImage는 RealImage 개체 로딩의 메모리 사용량을 줄이는 프록시 클래스입니다.
ProxyPatternDemo, 데모 클래스는 ProxyImage를 사용하여 Image 개체를 로드하고 필요에 따라 표시합니다.
1단계
인터페이스를 만듭니다.
Image.java
public interface Image { void display(); }
2단계
인터페이스를 구현하는 엔터티 클래스를 만듭니다.
RealImage.java
public class RealImage implements Image { private String fileName; public RealImage(String fileName){ this.fileName = fileName; loadFromDisk(fileName); } @Override public void display() { System.out.println("Displaying " + fileName); } private void loadFromDisk(String fileName){ System.out.println("Loading " + fileName); } }
ProxyImage.java
public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }
3단계
요청 시 ProxyImage를 사용하여 RealImage 클래스의 개체를 가져옵니다.
ProxyPatternDemo.java
public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_10mb.jpg"); //图像将从磁盘加载 image.display(); System.out.println(""); //图像将无法从磁盘加载 image.display(); } }
4단계
출력을 확인합니다.
rreee