-
[Design pattern] Proxy 패턴IT/Design pattern 2023. 1. 24. 17:14SMALL
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