GoF의 디자인 패턴, 프록시 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
이미 이전에 정리해 둔 Proxy를 보고오면 더 좋습니다.
ScreenDisplay
: 어떠한 데이터를 읽어 화면에 출력하는 개체BufferDisplay
: ScreenDisplay
의 역할을 대체하여 어떠한 이점을 얻기 위해 만든 ProxyScreenDisplay
개체를 내부적으로 가지고서 논리적으로 성능을 높힘 - "가상" 프록시Display
: 화면에 출력하기 위해 필요한 함수 인터페이스//
// main.swift
// Proxy
//
// Created by Choiwansik on 2023/01/10.
//
import Foundation
internal func main() {
let display = ScreenDisplay()
display.print(content: "안녕")
display.print(content: "난 완숙이야")
display.print(content: "난 개발자야")
display.print(content: "근데 난 반숙이 더 좋더라")
display.print(content: "계란은 후라이가 더 맛있어")
display.print(content: "스크램블은 버터를 꼭 빼줘")
display.print(content: "그럼 안녕")
}
main()
//
// Display.swift
// Proxy
//
// Created by Choiwansik on 2023/01/10.
//
import Foundation
internal protocol Display {
func print(content: String)
}
//
// ScreenDisplay.swift
// Proxy
//
// Created by Choiwansik on 2023/01/10.
//
import Foundation
internal class ScreenDisplay: Display {
internal func print(content: String) {
// content라는 문자열을 화면에 표시하려면 상당한 시간이 소요된다고 가정
Thread.sleep(forTimeInterval: 0.5)
Swift.print(content)
}
}
안녕
난 완숙이야
난 개발자야
근데 난 반숙이 더 좋더라
계란은 후라이가 더 맛있어
스크램블은 버터를 꼭 빼줘
그럼 안녕
Program ended with exit code: 0
print(content:)
메서드가 출력을 위해 준비시간이 오래걸리기 때문임//
// main.swift
// Proxy
//
// Created by Choiwansik on 2023/01/10.
//
import Foundation
internal func main() {
// notUsingProxy()
usingProxy()
}
internal func notUsingProxy() {
let display: Display = ScreenDisplay()
display.print(content: "안녕")
display.print(content: "난 완숙이야")
display.print(content: "난 개발자야")
display.print(content: "근데 난 반숙이 더 좋더라")
display.print(content: "계란은 후라이가 더 맛있어")
display.print(content: "스크램블은 버터를 꼭 빼줘")
display.print(content: "그럼 안녕")
}
internal func usingProxy() {
let display: Display = BufferDisplay(bufferSize: 5)
display.print(content: "안녕")
display.print(content: "난 완숙이야")
display.print(content: "난 개발자야")
display.print(content: "근데 난 반숙이 더 좋더라")
display.print(content: "계란은 후라이가 더 맛있어")
display.print(content: "스크램블은 버터를 꼭 빼줘")
display.print(content: "그럼 안녕")
guard let bufferDisplay = display as? BufferDisplay else {
return
}
bufferDisplay.flush()
}
main()
//
// BufferDisplay.swift
// Proxy
//
// Created by Choiwansik on 2023/01/10.
//
import Foundation
internal class BufferDisplay: Display {
internal init(bufferSize: Int) {
self.bufferSize = bufferSize
}
internal func print(content: String) {
self.buffer.append(content)
if self.buffer.count == self.bufferSize {
self.flush()
}
}
internal func flush() {
if self.screen == nil {
self.screen = ScreenDisplay()
}
let lines = self.buffer.joined(separator: "\n")
Swift.print(lines)
self.buffer.removeAll()
}
private var buffer = [String]()
private let bufferSize: Int
private var screen: ScreenDisplay?
}
ScreenDisplay
를 사용하지 않고 대리자인 BufferProxy
를 사용하여 속도를 높임flush
를 호출해주어야 함