[swift] Mediator 디자인 패턴으로 객체 간의 상호작용 중재

Mediator 패턴은 개체 간의 상호 작용을 조정하거나 중재하는 데 사용되는 소프트웨어 디자인 패턴입니다. 이 패턴은 개체 간의 직접 통신을 방지함으로써 결합을 줄이고 유연성과 재사용성을 높일 수 있습니다.

Mediator 패턴의 구성 요소

Mediator 패턴에는 다음과 같은 주요 구성 요소가 있습니다.

Mediator

Mediator 클래스는 개체 간의 통신을 관리하고 조정하는 역할을 담당합니다. 또한 개체들 간의 직접적인 상호 작용을 제거하며 대신 개체에게 중재자를 통해 요청을 전달합니다.

Colleague

Colleague 클래스는 Mediator와 통신하는 객체를 나타냅니다. 이들은 Mediator를 통해 다른 객체와 통신하며, 상호 작용을 위해 Mediator에 요청을 전송합니다.

Mediator 패턴의 장점

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

위의 예시에서 ConcreteMediatorMediator 프로토콜을 구현하고, ConcreteColleague1ConcreteColleague2Colleague 프로토콜을 구현합니다. ConcreteMediator는 각각의 ConcreteColleague에게 메시지를 전달하고, ConcreteColleague는 메시지를 수신합니다.

결론

Mediator 패턴을 사용하면 복잡한 객체 간의 상호 작용을 간단하게 조정할 수 있으며, 유연하고 재사용 가능한 구조를 구축할 수 있습니다.

더 많은 정보 및 예시는 GoF의 디자인 패턴 책에서 확인할 수 있습니다.