목차
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
'Design Pattern > 구조(Structural) 패턴' 카테고리의 다른 글
11. 방문자 패턴 Visitor Pattern (1) | 2023.11.12 |
---|---|
10. 데코레이터 패턴 / Decorator Pattern (0) | 2023.11.08 |
6. 브리지 패턴 (Bridge Pattern) (2) | 2023.11.01 |
4. 컴포지트 패턴 (Composite Pattern) (0) | 2023.10.30 |
3. 어댑터 패턴 (Adapter Pattern) (0) | 2023.10.29 |