중재자 패턴 (Mediator Pattern)

구교석·2024년 4월 18일
post-thumbnail

중재자 패턴이란?

중재자 패턴은 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴입니다. M:N 관계를 해당 패턴을 사용하면 M:1 관계로 만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리합니다.

M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당하도록 변경하면 중재자 패턴이라 볼 수 있습니다. 이와 같이 진행하면 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 느슨한 결합(loose coupling)을 유지할 수 있고 전체적인 흐름을 읽기 편해집니다.

단점으로는 특정 application에 맞춰져서 개발이 되기 때문에 재사용이 어렵습니다.

중재자 패턴 구조

Mediator

Colleague 객체 간의 상호참조를 위한 인터페이스. 클라이언트 등록, 실행 등의 메소드 정의

Colleague

다른 Colleague와의 상호참조를 위한 인터페이스.

ConcreteMediator

Mediator 구현 클래스. Colleague 간의 상호참조를 조정

ConcreteColleage

Colleague 구현 클래스. Mediator를 통해 다른 Colleague와의 상호참조

중재자 패턴 코드

interface Mediator {
    fun addUser(user: User)
    fun sendMessage(user: User, msg: String)
}
interface User {
    val mediator: Mediator
    fun receive(msg: String)
    fun send(msg: String)
}
class ManUser(
    override val mediator: Mediator
) : User {
    override fun receive(msg: String) {
        println("Man got msg: $msg")
    }

    override fun send(msg: String) {
        mediator.sendMessage(this, msg)
    }

}

class WomanUser(
    override val mediator: Mediator
) : User {
    override fun receive(msg: String) {
        println("Woman got msg: $msg")
    }

    override fun send(msg: String) {
        mediator.sendMessage(this, msg)
    }
}
class UserMessageMediator : Mediator {

    private val userList = arrayListOf<User>()

    override fun addUser(user: User) {
        userList.add(user)
    }

    override fun sendMessage(user: User, msg: String) {
        userList.forEach {
            if (it != user) it.receive(msg)
        }
    }
}
fun main() {
    val mediator = UserMessageMediator()
    val man = ManUser(mediator)
    val woman = WomanUser(mediator)

    mediator.addUser(man)
    mediator.addUser(woman)

    man.send("Hi, how are you?")
    woman.send("I am good!")
}
// Woman got msg: Hi, how are you?
// Man got msg: I am good!

참고 사이트


[Design Pattern] 중재자 패턴(Mediator Pattern)
중재자 패턴(Mediator Pattern)

profile
끊임없이 노력하는 개발자

0개의 댓글