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

케니스·2023년 2월 1일
1

Design Pattern

목록 보기
3/3

중재자 패턴(Mediator Pattern)이란

중재자 패턴(Mediator Pattern)은 객체간의 상호작용을 캡슐화하는 디자인 패턴으로 프로그램의 실행중 행위를 바꾸는 방법으로 Behavior Pattern에 속하게됩니다.

객체 지향 프로그래밍에서 프로그램은 일반적으로 비즈니스 로직이나 계산 처리로 분류된 수 많은 클래스들로 구성되어있고 이런 클래스간의 상호작용하는 커뮤니케이션이 많아질수록 유지보수나 리팩토링은 더 어려워집니다. 또한 하나의 클래스 코드에 변경이 발생하면서 다른 코드에도 영향을 미치게합니다.

중재자 패턴(Mediator Pattern)은 중재자라는 객체안에서 서로 다른 객체들을 캡슐화하여 객체들이 더 이상 직접적으로 상호작용하지않고 중재자를 통해서만 커뮤니케이션하도록 합니다. 이런 방법은 객체간의 커뮤니케이션에서 의존성을 줄이며 클래스간 느슨한 결합을 만듭니다.


목적과 사용 시점

중재자 패턴은 서로 상호작용하는 오브젝트들을 캡슐화함으로써 느슨한 결합을 유지하기 위해 사용합니다. 만약 객체들 사이의 M : N 의 관계가 형성되어 복잡한 상호작용을 하고 있다면 이것을 M : 1 관계로 바꿔주어 상호작용을 원활하게 합니다. 즉, 해당 패턴은 객체 간의 많은 의존관계를 가지거나 상호작용이 복잡해질 때 사용합니다.


구조

  • Mediator : Colleague 객체간의 커뮤니케이션을 위한 인터페이스 정의
  • Colleague : Mediator를 통해 다른 Colleague와 커뮤니케이션을 위한 인터페이스 정의
  • ConcreteMediator : Mediator 구현체로 Colleague들간의 상호 커뮤니케이션을 위해 Colleague들을 가지고 있으며 커뮤니케이션을 조정함
  • ConcreteColleague : 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!

옵저버 패턴과의 차이

옵저버 패턴은 1개의 발행자에 N개의 구독자가 존재하여 옵저버가 발행을 담당하고 중개자 패턴은 M개의 퍼블리셔와 N개의 구독자 사이에서 1개의 중개자를 통해 통신합니다. 옵저버 패턴은 재사용성은 좋지만 중개자 패턴은 애플리케이션의 로직에 맞추어 개발하기 때문에 재사용성 어렵습니다.

참고

profile
노력하는 개발자입니다.

0개의 댓글