[swift] Mediator 디자인 패턴

Mediator 디자인 패턴은 객체간의 상호작용을 중재하는 디자인 패턴입니다. 이 패턴은 객체가 서로 직접 통신하는 것을 방지하고 중재자(Mediator)를 통해 통신하도록 하는 구조를 제공합니다.

Mediator 패턴의 구조

Mediator 패턴은 다음과 같은 구조로 이루어집니다:

  1. Mediator (중재자): 객체들 간의 중재 및 조정을 담당하는 인터페이스를 정의합니다.
  2. ConcreteMediator (구체적인 중재자): Mediator 인터페이스를 구현하고, 객체들 간의 중재와 조정을 수행합니다.
  3. Colleague (동료): Mediator를 통해 통신을 하는 객체를 나타냅니다.
  4. ConcreteColleague (구체적인 동료): Colleague 인터페이스를 구현하고, Mediator를 통해 다른 객체들과 통신합니다.

Mediator 패턴의 예시

protocol Mediator {
    func sendMessage(message: String, colleague: Colleague)
}

protocol Colleague {
    var mediator: Mediator? { get set }
    func sendMessage(message: String)
    func receiveMessage(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 sendMessage(message: String, colleague: Colleague) {
        if colleague === colleague1 {
            colleague2.receiveMessage(message: message)
        } else {
            colleague1.receiveMessage(message: message)
        }
    }
}

class ConcreteColleague1: Colleague {
    var mediator: Mediator?

    func sendMessage(message: String) {
        mediator?.sendMessage(message: message, colleague: self)
    }

    func receiveMessage(message: String) {
        print("ConcreteColleague1 received message: \(message)")
    }
}

class ConcreteColleague2: Colleague {
    var mediator: Mediator?

    func sendMessage(message: String) {
        mediator?.sendMessage(message: message, colleague: self)
    }

    func receiveMessage(message: String) {
        print("ConcreteColleague2 received message: \(message)")
    }
}

let mediator = ConcreteMediator(colleague1: ConcreteColleague1(), colleague2: ConcreteColleague2())
mediator.colleague1.mediator = mediator
mediator.colleague2.mediator = mediator

mediator.colleague1.sendMessage(message: "Hello from colleague1")
mediator.colleague2.sendMessage(message: "Hello from colleague2")

위의 예시는 Mediator 패턴을 사용하여 두 개의 ConcreteColleague가 Mediator를 통해 통신하는 예시를 보여줍니다.

여기서는 ConcreteMediator가 Colleague들 간의 통신을 조정하고 있으며, 각 ConcreteColleague는 Mediator를 통해 메시지를 보내고 받습니다.

Mediator 패턴의 장점

Mediator 패턴을 사용하면 다음과 같은 장점을 얻을 수 있습니다:

Mediator 패턴은 복잡한 상호작용을 조정해야 하는 경우나 객체 간의 결합도를 낮춰야 하는 경우에 유용하게 사용될 수 있습니다.

결론

Mediator 패턴은 객체들 간의 상호작용을 중재하는 구조를 제공하여 유지보수성을 향상시키고 결합도를 줄이는데 도움이 됩니다. 이로 인해 소프트웨어의 유연성이 향상되고 복잡성이 줄어들 수 있습니다. 따라서 Mediator 패턴은 객체 지향 소프트웨어 개발에서 유용하게 활용될 수 있습니다.