프록시 패턴

프록시 패턴(proxy pattern)은 컴퓨터 프로그래밍에서 소프트웨어 디자인 패턴의 하나이다.
일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.
프록시 패턴의 잘 알려진 예로는 참조 횟수 스마트 포인터 객체이다.
복합적인 오브젝트들의 다수의 복사본이 존재해야만 하는 상황에서 프록시 패턴은 애플리케이션의 메모리 사용량을 줄이기 위해서 플라이웨이트 패턴과 결합된 형태로 나올 수도 있다.

자바

1 import java.util.*; 2  3 interface Image { 4     public void displayImage(); 5 } 6  7 //on System A 8 class RealImage implements Image { 9     private String filename;10     public RealImage(String filename) {11         this.filename = filename;12         loadImageFromDisk();13     }14 15     private void loadImageFromDisk() {16         System.out.println("Loading   " + filename);17     }18 19     @Override20     public void displayImage() {21         System.out.println("Displaying " + filename);22     }23 }24 25 //on System B26 class ProxyImage implements Image {27     private String filename;28     private Image image;29 30     public ProxyImage(String filename) {31         this.filename = filename;32     }33 34     @Override35     public void displayImage() {36         if (image == null)37            image = new RealImage(filename);38 39         image.displayImage();40     }41 }42 43 class ProxyExample {44     public static void main(String[] args) {45         Image image1 = new ProxyImage("HiRes_10MB_Photo1");46         Image image2 = new ProxyImage("HiRes_10MB_Photo2");47 48         image1.displayImage(); // loading necessary49         image2.displayImage(); // loading necessary50     }51 }
출력:
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 < 10; i++)
                image.Display();
        }
    }}
출력 :
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