Decorator pattern이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브 클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.
class Uploader {
private func setUp() {
/*...*/
}
func upload() {
setUp()
}
}
class TextUploader: Uploader {
override func upload() {
super.upload()
print("uploading text")
}
}
class ImageUploader: Uploader {
override func upload() {
super.upload()
print("uploading image")
}
}
class VideoUploader: Uploader {
override func upload() {
super.upload()
print("uploading video")
}
}
class VideoAndTextUploader: VideoUploader {
override func upload() {
super.upload()
print("uploading text")
}
}
class ImageAndTextUploader: ImageUploader {
override func upload() {
super.upload()
print("uploading text")
}
}
class Uploader {
private func setUp() {
/*...*/
}
func upload() {
setUp()
}
}
class DecoratedUploader: Uploader {
var uploader: Uploader?
init(_ uploader: Uploader? = nil) {
self.uploader = uploader
}
override func upload() {
super.upload()
uploader?.upload()
}
}
class TextUploader: DecoratedUploader {
override func upload() {
super.upload()
print("uploading text")
}
}
class ImageUploader: DecoratedUploader {
override func upload() {
super.upload()
print("uploading image")
}
}
class VideoUploader: DecoratedUploader {
override func upload() {
super.upload()
print("uploading video")
}
}
class FileUploader: DecoratedUploader {
override func upload() {
super.upload()
print("uploading file")
}
}
let textAndImageAndVideoUploader = TextUploader(ImageUploader(VideoUploader()))
let imageAndVideoUploader = ImageUploader(VideoUploader())
let everythingUplodaer = TextUploader(ImageUploader(VideoUploader(FileUploader())))
import UIKit
// 네트워크 요청을 표현하는 인터페이스 정의
protocol NetworkRequest {
var headers: [String: String] { get }
}
// 기본 요청 클래스
class BasicRequest: NetworkRequest {
var headers: [String : String] {
return ["Content-Type":"application/json"]
}
}
// NetworkRequest 인터페이스를 따르는 Decorator
class NetworkRequestDecorator: NetworkRequest {
private let decoratedRequest: NetworkRequest
init(_ decoratedRequest: NetworkRequest) {
self.decoratedRequest = decoratedRequest
}
var headers: [String : String] {
return decoratedRequest.headers
}
}
// 이 Decorator를 상속받아 각각의 추가 헤더를 구현하는 클래스들을 정의
class AuthenticatedRequest: NetworkRequestDecorator {
override var headers: [String: String] {
var headers = super.headers
headers["Authorization"] = "Bearer some_auth_token"
return headers
}
}
class AcceptLanguageRequest: NetworkRequestDecorator {
override var headers: [String : String] {
var headers = super.headers
headers["Accept-Language"] = "ko-KR"
return headers
}
}
var request: NetworkRequest = BasicRequest()
print(request.headers)
request = AuthenticatedRequest(request)
print(request.headers)
request = AcceptLanguageRequest(request)
print(request.headers)
["Content-Type": "application/json"]
["Content-Type": "application/json", "Authorization": "Bearer some_auth_token"]
["Content-Type": "application/json", "Authorization": "Bearer some_auth_token", "Accept-Language": "en-US"]
https://github.com/Jeon0976/ToyProject/tree/main/Coordinator/Coordinator
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.