본문 바로가기

Domain/디자인패턴

[디자인패턴] 미디에이터 패턴(Mediator Pattern)

미디에이터 패턴(Mediator Pattern)

미디에이터 패턴은 객체들 간의 상호작용 행위를 정리하여 따로 모아놓은 중재자(미디에이터) 객체를 따로 두어 관리하는 디자인 패턴이다. 객체 간의 직접적인 소통보다 중재자를 통해 소통하게 된다. 객체 간의 의존성을 줄여 결합도를 감소시킨다는 장점이 있다. 잘못 사용할 경우 중재자 객체에 모든 권한이 집중되어 크고 복잡해진다.

  • MediatorBase: Colleague 객체 간의 상호작용을 위한 인터페이스
  • ConcreteMediator: MediatorBase 인터페이스를 실제 구현하여 객체 간의 상호작용을 돕는 클래스
  • ColleagueBase: Colleague의 기본 인터페이스
  • ConcreteColleague: Colleague 인터페이스를 구현한 클래스로 Mediator를 통해 다른 ConcreteColleague와 상호작용을 한다.

 

예제

채팅방에 3명의 유저가 채팅에 참여 중이다. 한 유저가 채팅을 보내면 다른 유저들은 해당 채팅을 수신할 수 있다.

interface Mediator{
	fun sendMessage()
}

class ChatMediator:Mediator{
    private val users: MutableList<User> = ArrayList()
   
    override fun sendMessage(msg:String, user:User){
    	users.filter{it!=user}.forEach{it.receive(msg)}
    }
    
    fun notify(msg){
    	users.forEach{it.receive(msg)}
    }
    
    fun addUser(user:User) = users.add(user)
}

interface User{
    val mediator: ChatMediator
    val name: String
    
    //default Method
    fun send(msg:String){
    	println("$name:Send Message = $msg")
        mediator.sendMessage(msg, this)
    }
    //default Method
    fun receive(msg:String){
    	println("$name:Receive Message = $msg")
    }
}

class MasterUser(
    override val mediator: ChatMediator,
    override val name:String
): User{
    fun notify(msg:String){
    	mediator.notify(msg)
    }
}

class GeneralUser(
    override val mediator: ChatMediator,
    override val name:String
): User{

}

위에서 설명한대로 Mediator는 객체들 간의 통신을 중재하고, User들은 mediator를 통해 다른 객체와 통신한다.

 

메인 함수

fun main(){
    val mediator = ChatMediator()
    val user1 = MasterUser(mediator,"Gong")
    val user2 = MasterUser(mediator,"Kim")
    val user3 = MasterUser(mediator,"Lee")
    mediator.run{
    	add(user1)
        add(user2)
        add(user3)
    }
    
    user1.send("Hello World")
}

//프린트
Gong: Sending Message = Hello World
Kim: Recevie Message = Hello World
Lee: Recevie Message = Hello World

 

 

요약

  • 여러 객체 간 통신으로 인해 결합도가 높을 경우 중재자 패턴을 사용할 수 있다
  • 중재자 패턴에서 객체들 간의 상호작용을 매개한다