Proxy Pattern (대리자 패턴)
-- 처리과정이 복잡하거나 시스템의 리소스를 많이 필요하거나 하는 객체가 필요할 때,
-- 간단한 처리는 대리자가 하고 실제객체가 필요할 때 생성하여 처리하는 패턴.
1. Remote Proxy : 원격 객체에 대한 로컬의 대리자
: RMI(Remote Method Invoke)
: C# WCF(SOAP), Android(Proxy), COM(RPC)
2. Virtual Proxy : 많은 비용이 요구되는 객체를 생성하는 경우 실제 객체가 사용되기 전 까지
해당하는 객체에 대한 로딩을 지연할 수 있다.
Flyweight Pattern과 함께 사용한다. (Cache)
3. Protection Proxy : 보호가 요구되는 객체에 대한 접근을 통제하고, 대리자를 통해 접근 제어하는 방법
객체의 타입에 따른 접근 제어 (ex. 리플렉션)
- package com.tistory.metalbird;
- import java.util.ArrayList;
- import java.util.List;
- class Calc {
- public void plus() {
- }
- }
- class CalcProxy {
- public void plus() {
- new Calc().plus(); // RMI 기술의 예. 중간객체를 둠으로써 문제를 해결
- }
- }
- // 인터페이스 기반의 설계
- interface Image {
- void showImage();
- }
- class ImageProxy implements Image {
- private String url;
- public ImageProxy(String url) {
- this.url = url;
- }
- @Override
- public void showImage() {
- // show image 가 호출 되었을때 로딩을 한다.
- // 부하가 많이 걸리는 작업을 대리자에게 넘긴다.
- System.out.println("lazy load");
- RealImage image = new RealImage(url);
- image.showImage();
- }
- }
- // 라이브러리 형태로 존재
- class RealImage implements Image {
- private String url;
- public RealImage(String url) {
- this.url = url;
- // downloading from url.
- // 부하가 많이 걸린다.
- }
- public void showImage() {
- System.out.println("ShowImage : " + url);
- }
- }
- public class Ex1 {
- public static void main(String[] args) {
- List<Image> images = new ArrayList<>();
- images.add(new ImageProxy("http://a.net/1.jpg"));
- images.add(new ImageProxy("http://a.net/2.jpg"));
- images.add(new ImageProxy("http://a.net/3.jpg"));
- images.add(new ImageProxy("http://a.net/4.jpg"));
- for (Image i : images) {
- i.showImage();
- }
- }
- }
'java > design_pattern' 카테고리의 다른 글
Memento Pattern - 메멘토 패턴 (0) | 2014.07.01 |
---|---|
Command Pattern - 명령패턴 (0) | 2014.07.01 |
Iterator Pattern - 열거자 (0) | 2014.07.01 |
Visitor Pattern - 방문자 패턴 (0) | 2014.07.01 |
Chain of Responsibility Pattern - 책임의 전가 (0) | 2014.07.01 |