GoF의 디자인 패턴, 책임연쇄 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
이미 이전에 정리해 둔 Chain Of Responsibility를 보고오면 더 좋습니다.
setNext
자체를 실행시킬 수 없다.//
// Handler.swift
// ChainOfResponsibility
//
// Created by Choiwansik on 2023/01/16.
//
import Foundation
internal protocol Handler {
var nextHandler: Handler? { get set }
mutating func setNext(handler: Handler) -> Handler
func run(url: URL)
func process(url: URL)
}
extension Handler {
internal mutating func setNext(handler: Handler) -> Handler {
self.nextHandler = handler
return handler
}
internal func run(url: URL) {
self.process(url: url)
if let nextHandler {
nextHandler.run(url: url)
}
}
}
//
// ProtocolHandler.swift
// ChainOfResponsibility
//
// Created by Choiwansik on 2023/01/16.
//
import Foundation
internal class ProtocolHandler: Handler {
internal func process(url: URL) {
if let scheme = url.scheme {
print("Protocol: \(scheme)")
} else {
print("No Protocol")
}
}
internal var nextHandler: Handler?
}
//
// DomainHandler.swift
// ChainOfResponsibility
//
// Created by Choiwansik on 2023/01/16.
//
import Foundation
internal class DomainHandler: Handler {
internal func process(url: URL) {
if let host = url.host {
print("Domain: \(host)")
} else {
print("No Domain")
}
}
internal var nextHandler: Handler?
}
//
// PortHandler.swift
// ChainOfResponsibility
//
// Created by Choiwansik on 2023/01/16.
//
import Foundation
internal class PortHandler: Handler {
internal func process(url: URL) {
if let port = url.port {
print("Port: \(port)")
} else {
print("No Port")
}
}
internal var nextHandler: Handler?
}
//
// main.swift
// ChainOfResponsibility
//
// Created by Choiwansik on 2023/01/16.
//
import Foundation
internal func 기존의위키피디아에서나오는책임연쇄패턴() {
var protocolHandler: Handler = ProtocolHandler()
var domainHandler: Handler = DomainHandler()
var portHandler: Handler = PortHandler()
protocolHandler
.setNext(handler: domainHandler)
.setNext(handler: portHandler)
protocolHandler.run(url: URL(string: "https://naver.com"))
// Swift에서는 return 값이 immutable이라 변경할 수 없다!!
// 애초에 위와 같이 작성하는 것도 문제가 있다고 본다.
}
기존의위키피디아에서나오는책임연쇄패턴()
setNext()
같은 것을 사용해야 하는가?