apple/DesignPattern, Architecture
Swift 디자인패턴 Mediator Pattern (중재자 패턴)
lgvv
2022. 6. 15. 15:42
Swift 디자인패턴 Mediator Pattern (중재자 패턴)
Mediator Pattern은 객체 간의 복잡한 의사소통을 캡슐화하는 행동 패턴
히스토리
- 2022-06-15: 디자인 패턴 스터디 정리
- 2024-11-26: 포스팅 글 재정리 및 예제 변경
Mediator Pattern
객체들이 직접 상호작용하지 않고, 중재자(Mediator)를 통해서만 소통하도록 설계.
- 객체 간의 강한 결합을 줄이고 코드의 유연성을 높일 수 있음
중재자 패턴은 일반적으로 4가지 개념으로 구성
- Colleague: 의사소통에 참여하는 객체로, 각 동료는 Mediator를 통해 간접적으로 소통
- Colleague Protocol: Colleague들이 구현해야 하는 메서드와 속성을 정의
- Mediator: Colleague 간의 의사소통을 조율하며, 각 동료 객체는 Mediator 객체에 대한 참조를 가짐
- Mediator Protocol: Mediator가 구현해야 하는 메서드와 속성을 정의
중재자 패턴 적용을 고려할 수 있는 상황
- 객체 간의 복잡한 의존성을 줄이고 싶을 때
- 객체들이 서로의 상태에 영향을 미치며 이벤트를 생성하거나 반응할 때
코드 예제
이벤트를 서로가 서로에게만 전달하는 구조
import SwiftUI
protocol MediatorProtocol: AnyObject {
func send(message: String, from colleague: Colleague)
}
class Mediator: MediatorProtocol {
private var colleagues: [Colleague] = []
func register(colleague: Colleague) {
colleagues.append(colleague)
}
func send(message: String, from colleague: Colleague) {
for receiver in colleagues where receiver !== colleague {
receiver.receive(message: message)
}
}
}
class Colleague {
let name: String
private weak var mediator: MediatorProtocol?
init(name: String, mediator: MediatorProtocol) {
self.name = name
self.mediator = mediator
}
func send(message: String) {
print("\(name) sends message: \(message)")
mediator?.send(message: message, from: self)
}
func receive(message: String) {
print("\(name) received message: \(message)")
}
}
private struct ContentView: View {
var body: some View {
Button("Execute") {
// 사용 예시
let mediator = Mediator()
let colleague1 = Colleague(name: "Alice", mediator: mediator)
let colleague2 = Colleague(name: "Bob", mediator: mediator)
mediator.register(colleague: colleague1)
mediator.register(colleague: colleague2)
colleague1.send(message: "Hello, Bob!")
colleague2.send(message: "Hi, Alice!")
}
}
}
#Preview {
ContentView()
}
(참고)
https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/19-mediator-pattern
https://refactoring.guru/ko/design-patterns/mediator