
디자인패턴 시작하기를 보고 정리하기
Diff
- 디자인 패턴에서의 Proxy: 실제 객체(Real Object)에 접근하기 전, 대리 객체를 두어 요청을 제어/위임하는 패턴
- 네트워크에서의 Proxy: 클라이언트와 서버 사이에 위치해 요청과 응답을 대신 전달하는 중간 서버

public interface Display {
void print(String content);
}
public class ScreenDisplay implements Display {
public void print(String content) {
// 출력 준비 작업에 시간이 소요된다고 가정.
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
// 준비 완료 후 출력
System.out.println(content);
}
}
import java.util.ArrayList;
public class BufferDisplay implements Display {
private ArrayList<String> buffer = new ArrayList<String>();
private ScreenDisplay screen;
private int bufferSize; // 컨텐츠가 몇개 모이면 출력할 것인지를 담음
public BufferDisplay(int bufferSize) {
this.bufferSize = bufferSize;
}
public void print(String content) {
buffer.add(content);
if (buffer.size() == bufferSize) {
flush();
}
}
// buffer의 내용을 크기와 상관없이 바로 출력
// flush()를 호출하지 않으면 buffer 크기만큼만 출력
public void flush() {
if (screen == null) screen = new ScreenDisplay();
String lines = String.join("\n", buffer);// 전처리
screen.print(lines);
buffer.clear();// 모두 출력 후 버퍼 삭제
}
}
import java.util.Random;
public class Main {
public static void main(String[] args){
// 상황 1) 출력을 위한 준비 작업에 많은 시간이 소요되어 속도가 느림
// 각 print 마다 전처리에 시간 소요..
// Display display1 = new ScreenDisplay();
//
// display1.print("안녕하세요1");
// display1.print("안녕하세요2");
// display1.print("안녕하세요3");
// display1.print("안녕하세요4");
// display1.print("안녕하세요5");
// 상황 1 개선 >> 출력할 데이터를 최대한 모아서 print 를 최소한으로 출력 한다.
// 상황 2) Buffer 구현
Display display2 = new BufferDisplay(5);
display2.print("1111111111");
display2.print("2222222222");
display2.print("33333333");
display2.print("4444444444");
display2.print("555555555");
display2.print("6666666666");
display2.print("777777777");
display2.print("888888888");
// 사이즈보다 적은 사이즈의 데이터가 남아 있을 수도 있으므로,
// 마지막에는 flush 로 남은 데이터를 모두 출력 및 버퍼 clear
((BufferDisplay)display2).flush();
}
}