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