본문 바로가기

코딩/Software Architecture

[GoF Design Pattern] Proxy

*Proxy Pattern : 어떤 작업의 실행을 대리인을 통해 실행하도록 하는 패턴

 

ScreenDisplay: 어떤 문자열을 화면에 출력하는 기능 제공

BufferDisplay: <대리인> 문자열을 출력할 때 ScreenDisplay 대신 해당 클래스 사용 가능.

Display: 두 Display를 하나의 타입으로 처리할 수 있도록 함, 또 시스템이 해당 인터페이스와 관계를 맺음으로써 관계의 수가 1개로 줄어드는 효과가 있음.

 

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

public class ScreenDisplay implement Display {
	@Override
    public void print(String content) { // content 출력에 상당한 시간 및 준비 작업이 필요하다 가정!
    	try {
        	Thread.sleep(500); // 준비 작업
    	} catch (InterruptedException e) {
        	e.printStackTrace();
        }
        System.out.println(content);
    }
}
// 출력 시간을 단축하기 위해선 출력할 데이터를 최대한 모아 프린터 메서드를 최소한으로 호출하면 됌.
public class BufferDisplay implement Display {
    private ArrayList<String> buffer new ArrayList<>();
    prvate 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();
     }
}

구현한 클래스 활용.

// BufferDisplay 를 활용한 출력

public static void main(String[] args) {
    Display display = BufferDisplay(5);
    
    displat.print("1");
    displat.print("2");
    displat.print("3");
    displat.print("4");
    displat.print("5");
    displat.print("6");
    displat.print("7");
    displat.print("8");
    
    ((BufferDisplay)display).flush();
    // bufferSize 도달 못한 나머지 것 플러싱 필요!
}