ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design pattern] Proxy 패턴
    IT/Design pattern 2023. 1. 24. 17:14
    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
Designed by Tistory.