본문 바로가기

Design Pattern/구조(Structural) 패턴

8. 프록시 패턴 / Proxy Pattern

목차

1. 프록시 패턴 / Proxy Pattern 이란?

2. 프록시 패턴 구조

3. 예시


프록시 패턴 / Proxy Pattern 이란?

 

proxy 는 대리인, 대변인 이라는 의미를 가지고 있습니다.

 

여기서 대리인, 대변인은 누군가를 대신해서 어떠한 역할을 수행하는 존재들 입니다.

 

프록시 패턴은 이와 마찬가지로 대리인을 통해 실행하도록하는 구조 디자인 패턴입니다.


 

프록시 패턴 구조 Proxy Pattern Structure

 

 

이름 내용
DIsplay 출력 기능의 정의한 인터페이스
ScreenDisplay 문자열을  출력해주는 기능을가진 클래스
BufferDisplay ScreenDIsplay 의 Proxy 클래스
Main  메인 클래스

 


예제

 

DIsplay 인터페이스

 

print 메서드를 정의합니다.

public interface Display {
    void print(String content);
}

 

 

ScreenDisplay 클래스

 

Display 인터페이스를 구현합니다.

 

여기서 Thead.sleep(500) 을 건 이유는 데이터를 가져오는데 시간이 걸림을 나타내기 위해서 입니다.

public class ScreenDisplay implements Display{
    @Override
    public void print(String content) {

        try {
            Thread.sleep(500);
        } catch( InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(content);

    }
}

 

 

BufferDisplay 클래스

 

ScreenDIsplay 클래스의 Proxy 클래스 입니다.

 

일정한 길이의 데이터가 쌓였을때 한번에 출력을 하도록 도와주는 기능을 가지고 있습니다.

 

이로인해 내용을 출력할때 소요되는 500ms 의 시간을 줄일 수 있습니다.

 

flush 메서드는 List 사이즈가 일정 이상 채워지지 않고 출력이 끝났을때 사용하기 위한 메서드 입니다.

남아있는 내용들은 출력합니다.

public class BufferDisplay implements Display{

    private ArrayList<String> buffer = new ArrayList<>();
    private ScreenDisplay screen;
    private int bufferSize;

    public BufferDisplay(int bufferSize) {
        this.bufferSize = bufferSize;
    }

    @Override
    public void print(String content) {
        buffer.add(content);
        if(buffer.size() == bufferSize) {
            flush();
        }
    }

    public void flush() {
        if(screen == null) screen = new ScreenDisplay();
        String lines = String.join("\n", buffer);
        screen.print(lines);
        buffer.clear();
    }
}

 

 

Main 클래스

 

ScreenDisplay 클래스 사용

 

proxy 패턴을 사용하기전 입니다. 

print 메서드에 500ms 지연을 걸어두어서 약 1500ms 의 시간이 걸렸습니다.

public class Main {

    public static void main(String[] args) {
    
        Long start = System.currentTimeMillis();

        Display screenDisplay = new ScreenDisplay();

        screenDisplay.print("안녕하세요");
        screenDisplay.print("개발자입니다.");
        screenDisplay.print("디자인패턴 중 proxy 패턴 예제입니다.");

        Long end = System.currentTimeMillis();

        System.out.println( "총 실행시간 : " + (end - start) + "ms");

    }
}

실행결과 

안녕하세요
개발자입니다.
디자인패턴 중 proxy 패턴 예제입니다.
총 실행시간 : 1516ms

 

 

BufferDisplay 클래스 사용

 

proxy 패턴을 사용한 후 입니다.

 

ScreenDisplay 에 직접 접근하지 않고 Proxy 객체를 생성하여 대신 일을 합니다.

또한 추가적인 기능을 추가하여 개선된 모습을 볼 수 있습니다.

 

public class Main {

    public static void main(String[] args) {

        Long start = System.currentTimeMillis();

        Display bufferDisplay = new BufferDisplay(2);

        bufferDisplay.print("안녕하세요");
        bufferDisplay.print("개발자입니다.");
        bufferDisplay.print("디자인패턴 중 proxy 패턴 예제입니다.");

        ((BufferDisplay)bufferDisplay).flush();

        Long end = System.currentTimeMillis();

        System.out.println( "총 실행시간 : " + (end - start) + "ms");

    }
}

실행 결과

안녕하세요
개발자입니다.
디자인패턴 중 proxy 패턴 예제입니다.
총 실행시간 : 1025ms

 

 


참조

 

https://www.youtube.com/watch?v=NoRPG06c48U&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=14