[GoF] Proxy 패턴

패턴명칭

Proxy

필요한 상황

어떤 기능을 바로 실행하기보다는 모았다가 한번에 실행하도록 하는 것이 효율적인 경우에 사용할 수 있는 패턴이다. 또는 어떤 입력값에 대한 결과를 별도로 저장해 뒀다가 동일한 입력값에 대한 결과를 다시 요청받았을때 미리 저장해둔 결과를 전달해 속도 향상을 꽤할 수 있는 패턴이다.

예제 코드

ScreenDisplay 클래스는 입력 문자열을 화면(Screen)에 출력한다. BufferDisplay는 입력 문자열을 바로 출력하지 않고 일단 모은 후에 정해진 개수만큼 모이면 ScreenDisplay 클래스의 객체를 이용해 화면에 출력한다. Display는 출력한라는 인터페이스를 제공하며 이를 구현하는 BufferDisplay와 ScreenDisplay는 사용자의 입장에서 Display로 동일하게 다룰 수 있다.

Display 인터페이스는 다음과 같다.

package pattern;

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

ScreenDisplay 클래스는 다음과 같다.

package pattern;

public class ScreenDisplay implements Display {
	@Override
	public void print(String content) {
		System.out.println(content);
	}
}

BufferDisplay 클래스는 다음과 같다.

package pattern;

import java.util.Iterator;
import java.util.LinkedList;

public class BufferDisplay implements Display {
	private LinkedList<String> contents = new LinkedList<String>();
	private ScreenDisplay screen = new ScreenDisplay();
	private int bufferSize;
	
	public BufferDisplay(int bufferSize) {
		this.bufferSize = bufferSize;
	}
	
	@Override
	public void print(String content) {
		contents.add(content);
		
		if(contents.size() == bufferSize) {
			Iterator<String> iter = contents.iterator();
			while(iter.hasNext()) {
				String bufferedContent = iter.next();
				screen.print(bufferedContent);
			}
		}
	}
}

지금까지 정의된 클래스를 사용하는 코드가 정의된 User 클래스는 다음과 같다.

package pattern;

public class User {
	public static void main(String[] args) {
		Display display = new BufferDisplay(3);
		
		display.print("Hello.");
		display.print("My name is Endru.");
		display.print("What's you name?");
		display.print("I am 10 years old.");
		display.print("How old are you?");
	}
}

실행 결과는 다음과 같다.

Hello.
My name is Endru.
What's you name?

User 클래스의 코드를 보면 총 5개의 문자열을 출력하라고 했으나, 실제로는 3개의 문자열만 출력된다. 이는 BufferDisplay가 5개의 문자열이 모아지는 경우에만 실제로 화면에 출력하기 때문이다.

이 글은 소프트웨어 설계의 기반이 되는 GoF의 디자인패턴에 대한 강의자료입니다. 완전한 실습을 위해 이 글에서 소개하는 클래스 다이어그램과 예제 코드는 완전하게 실행되도록 제공되지만, 상대적으로 예제 코드와 관련된 설명이 함축적으로 제공되고 있습니다. 이 글에 대해 궁금한 점이 있으면 댓글을 통해 남겨주시기 바랍니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다