[Design pattern] Proxy 패턴

2023. 1. 24. 17:14IT/Design pattern

SMALL

Proxy pattern 이란?

  • Proxy의 뜻은 '대리인' 이라는 뜻
  • 어떤 작업의 실행을 대리인을 통해 실행하도록 하는 패턴

예제

전달받은 문자열을 1초의 딜레이로 화면에 표시해주는 ScreenDisplay 객체가 있다.  Proxy를 이용하여 ScreenDisplay의 성능을 개선해보자

val display = ScreenDisplay()

display.print("안녕")
display.print("헬로")
display.print("곤니치와")
display.print("니하오")

결과
1초 딜레이...
안녕
1초 딜레이...
헬로
1초 딜레이...
곤니치와
1초 딜레이...
니하오


를 아래와 같이 개선한다

결과
1초 딜레이...
안녕
헬로
곤니치와
니하오

 

전체 예제 코드

fun main(args: Array<String>) {
    val screenDisplay = ScreenDisplay()
    val bufferedDisplay = BufferedDisplay(3 )

    screenDisplay.print("안녕")
    screenDisplay.print("헬로")
    screenDisplay.print("곤니치와")
    screenDisplay.print("니하오")

    bufferedDisplay.print("안녕")
    bufferedDisplay.print("헬로")
    bufferedDisplay.print("곤니치와")
    bufferedDisplay.print("니하오")

    bufferedDisplay.flush()
}


interface Display{
    fun print(content: String)
}

/// 실제 display 클래스
class ScreenDisplay : Display {
    override fun print(content: String) {
        try {
            println("1초 딜레이...")
            Thread.sleep(1000)

            println(content)
        } catch (e: Exception) {
            print(e.stackTrace.toString())
        }
    }
}

/// display 프록시 클래스
/// bufferSize 만큼 buffer 가 차면 flush 함수를 통해 저장된 content를 display에 표시한다
class BufferedDisplay(private val bufferSize: Int) : Display{

    private val buffer = arrayListOf<String>()
    private val screenDisplay: ScreenDisplay by lazy { ScreenDisplay() }

    override fun print(content: String) {
        buffer.add(content)

        if(buffer.size >= bufferSize) {
            flush()
        }
    }

    fun flush(){
        screenDisplay.print(buffer.joinToString("\n"))

        buffer.clear()
    }

}

 

결과

// real work
1초 딜레이...
안녕
1초 딜레이...
헬로
1초 딜레이...
곤니치와
1초 딜레이...
니하오


// proxy work
1초 딜레이...
안녕
헬로
곤니치와
1초 딜레이...
니하오

 

참고

Proxy 패턴 vs Decorator 패턴

두 패턴은 구조가 매우 유사한 것을 알 수 있는데, 패턴의 사용 의도에따라 구분할 수 있다.

Proxy 패턴의 경우 실제 객체에 대한 접근을 제어하는데 초점이 맞추어져 있는 반면에 Decorator 패턴의 경우 기존 기능의 확장에 초점이 맞추어져 있다.

LIST

'IT > Design pattern' 카테고리의 다른 글

[Design pattern] Adapter 패턴  (0) 2023.01.22