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 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

 

Design Patterns by Tutorials, Chapter 19: Mediator Pattern

This is a behavioral design pattern that encapsulates how objects, called colleagues for this pattern, communicate with one another. This pattern is useful to separate interactions between colleagues into an object, the mediator. Learn how to use it when y

www.kodeco.com:443

https://refactoring.guru/ko/design-patterns/mediator