프록시 패턴

파일:proxy_pattern_diagram.svg|섬네일|400px|UML의 프록시
파일:Proxy pattern in LePUS3.gif|섬네일|400px|LePUS3의 프록시 ( legend) 
'''프록시 패턴'''(proxy pattern)은 컴퓨터 프로그래밍에서 소프트웨어 디자인 패턴의 하나이다.
일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.
프록시 패턴의 잘 알려진 예로는 참조 횟수 스마트 포인터 객체이다.
복합적인 오브젝트들의 다수의 복사본이 존재해야만 하는 상황에서 프록시 패턴은 애플리케이션의 메모리 사용량을 줄이기 위해서 플라이웨이트 패턴과 결합된 형태로 나올 수도 있다.
=== 자바 ===
import java.util.*;
interface Image {
    public void displayImage();
}
//on System A
class RealImage implements Image {
    private String filename;
    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }
    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }
    @Override
    public void displayImage() {
        System.out.println("Displaying " + filename);
    }
}
//on System B
class ProxyImage implements Image {
    private String filename;
    private Image image;
    public ProxyImage(String filename) {
        this.filename = filename;
    }
    @Override
    public void displayImage() {
        if (image == null)
           image = new RealImage(filename);
        image.displayImage();
    }
}
class ProxyExample {
    public static void main(String args) {
        Image image1 = new ProxyImage("HiRes_10MB_Photo1");
        Image image2 = new ProxyImage("HiRes_10MB_Photo2");
        image1.displayImage(); // loading necessary
        image2.displayImage(); // loading necessary
    }
}
출력:
 Loading    HiRes_10MB_Photo1
 Displaying HiRes_10MB_Photo1
 Loading    HiRes_10MB_Photo2
 Displaying HiRes_10MB_Photo2
=== C# ===
using System;
namespace Proxy
{
    class Program
    {
        interface IImage
        {
            void Display();
        }
        class RealImage : IImage
        {
            public RealImage(string fileName)
            {
                FileName = fileName;
                LoadFromFile();
            }
            private void LoadFromFile()
            {
                Console.WriteLine("Loading " + FileName);
            }
            public String FileName { get; private set; }
            public void Display()
            {
                Console.WriteLine("Displaying " + FileName);
            }
        }
        class ProxyImage : IImage
        {
            public ProxyImage(string fileName)
            {
                FileName = fileName;
            }
            public String FileName { get; private set; }
            private IImage image;
            public void Display()
            {
                if (image == null)
                    image = new RealImage(FileName);
                image.Display();
            }
        }
        static void Main(string args)
        {
            IImage image = new ProxyImage("HiRes_Image");
            for (int i = 0; i 
출력 :
 Loading HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
* 컴포지트 패턴
* 데코레이터 패턴
분류:소프트웨어 디자인 패턴