Mediator 패턴은 개체 간의 상호 작용을 조정하거나 중재하는 데 사용되는 소프트웨어 디자인 패턴입니다. 이 패턴은 개체 간의 직접 통신을 방지함으로써 결합을 줄이고 유연성과 재사용성을 높일 수 있습니다.
Mediator 패턴의 구성 요소
Mediator 패턴에는 다음과 같은 주요 구성 요소가 있습니다.
Mediator
Mediator 클래스는 개체 간의 통신을 관리하고 조정하는 역할을 담당합니다. 또한 개체들 간의 직접적인 상호 작용을 제거하며 대신 개체에게 중재자를 통해 요청을 전달합니다.
Colleague
Colleague 클래스는 Mediator와 통신하는 객체를 나타냅니다. 이들은 Mediator를 통해 다른 객체와 통신하며, 상호 작용을 위해 Mediator에 요청을 전송합니다.
Mediator 패턴의 장점
Mediator 패턴은 다음과 같은 장점을 가지고 있습니다.
- 결합도 감소: Mediator를 통해 개체 간의 직접적인 통신을 막아 결합도를 줄일 수 있습니다.
- 유연성 증가: Mediator를 통해 개체 사이의 상호 작용 방식을 동적으로 변경할 수 있습니다.
- 재사용성 향상: Mediator를 사용하면 다른 Colleague와 재사용 가능한 Mediator를 조합하여 유연한 구조를 만들 수 있습니다.
Mediator 패턴의 예시
다음은 Mediator 패턴을 사용하여 두 개체 간의 통신을 조정하는 간단한 예시의 Swift 코드입니다.
import UIKit
protocol Mediator {
func send(message: String, sender: Colleague)
}
protocol Colleague {
var mediator: Mediator { get }
func send(message: String)
func receive(message: String)
}
class ConcreteMediator: Mediator {
private var colleague1: Colleague
private var colleague2: Colleague
init(colleague1: Colleague, colleague2: Colleague) {
self.colleague1 = colleague1
self.colleague2 = colleague2
}
func send(message: String, sender: Colleague) {
if sender === colleague1 {
colleague2.receive(message: message)
} else {
colleague1.receive(message: message)
}
}
}
class ConcreteColleague1: Colleague {
let mediator: Mediator
init(mediator: Medvoid iator) {
self.mediator = mediator
}
func send(message: String) {
mediator.send(message: message, sender: self)
}
func receive(message: String) {
print("ConcreteColleague1 received: \(message)")
}
}
class ConcreteColleague2: Colleague {
let mediator: Mediator
init(mediator: Mevoid diator) {
self.mediator = mediator
}
func send(message: String) {
mediator.send(message: message, sender: self)
}
func receive(message: String) {
print("ConcreteColleague2 received: \(message)")
}
}
let mediator = ConcreteMediator(colleague1: ConcreteColleague1(mediator: mediator), colleague2: ConcreteColleague2(mediator: mediator))
mediator.colleague1.send(message: "Hello from colleague1")
mediator.colleague2.send(message: "What's up from colleague2")
위의 예시에서 ConcreteMediator
는 Mediator
프로토콜을 구현하고, ConcreteColleague1
과 ConcreteColleague2
는 Colleague
프로토콜을 구현합니다. ConcreteMediator
는 각각의 ConcreteColleague
에게 메시지를 전달하고, ConcreteColleague
는 메시지를 수신합니다.
결론
Mediator 패턴을 사용하면 복잡한 객체 간의 상호 작용을 간단하게 조정할 수 있으며, 유연하고 재사용 가능한 구조를 구축할 수 있습니다.
더 많은 정보 및 예시는 GoF의 디자인 패턴 책에서 확인할 수 있습니다.