GoF 디자인패턴 - Proxy

Clean Code Big Poo·2025년 6월 3일
0
post-thumbnail

Overview

디자인패턴 시작하기를 보고 정리하기

Proxy

  • '대리인' 의미 Proxy = 비서
  • 어떤 작업을 '대리인'을 통해 실행하는 패턴

    Diff

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

다이어그램

  • ScreenDisplay : 어떤 문자열을 화면에 출력
  • BufferDisplay : 대리인, ScreenDisplay말고 BufferDisplay 사용 가능
  • Display : ScreenDisplay, BufferDisplay 를 하나의 타입으로 사용하기 위함.
    결합도를 낮추기 위함.

구현 코드

Display

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

ScreenDisplay

public class ScreenDisplay implements Display {
    
    public void print(String content) {
        // 출력 준비 작업에 시간이 소요된다고 가정.
        try {
            Thread.sleep(500);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 준비 완료 후 출력
        System.out.println(content);
    }
}

BufferDisplay

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();// 모두 출력 후 버퍼 삭제
    }
}

Main

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();
    }
}

0개의 댓글