본문 바로가기

OOP/디자인 패턴

Mediator 패턴

1. Mediator 패턴의 필요성

예를 들어 네비게이션 버튼에 따라 목록/사진첩을 보여줘야 한다고 가정하자.

이 경우에 목록을 클릭 했을 때는 사진첩을 가리고 목록에 보여줄 데이터를 받아와서 보여준다

사진첩의 경우엔 목록을 가리고 사진을 서버에서 가져와 보여주게 된다..

코드로 보게 되면 아래와 같다.

 

class ModeSwitch {
    var mode : Mode = Mode.LIST
    var listView = ListView()
    val galleryView = GalleryView()
    val dataDownloader = DataDownloader()

    fun toggleMode(){
        mode = if(mode==Mode.LIST){
            Mode.GALLERY
        }else{
            Mode.LIST
        }
        listView.onModeChange(mode)
        galleryView.onModeChange(mode)
        dataDownloader.onModeChange(mode)
    }

}

enum class Mode {LIST , GALLERY}

 

이처럼 필요한 모든 객체를 생성하여 일일이 mode의 변화를 알려줘야 한다.

필요한 객체가 늘어나면 늘어날 수록 관리의 비용이 늘어나게 된다.

 

 

이러한 경우에 mediator 즉, 중재자를 둬 모드가 변경될 경우 중재자가 모두에게 대신 알리도록 하는 것이다. 

2. 예시 코드

2-1) 필요한 구성 요소들 생성

interface ModeListener{
    fun onModeChange(mode : Mode)
}

class ListView : ModeListener{
    override fun onModeChange(mode: Mode) {
        if(mode == Mode.LIST){
            Log.e("ListView","show")
        }else{
            Log.e("ListView","hide")
        }
    }
}

class GalleryView : ModeListener{
    override fun onModeChange(mode: Mode) {
        if(mode == Mode.GALLERY){
            Log.e("GalleryView","show")
        }else{
            Log.e("GalleryView","hide")
        }
    }
}


class DataDownloader : ModeListener{
    override fun onModeChange(mode: Mode) {
        if(mode == Mode.LIST){
            Log.e("ListView","downloader")
        }else{
            Log.e("GalleryView","downloader")
        }
    }
}

2-2) mediator 

class ModeMediator {
    private val listeners : MutableList<ModeListener> = mutableListOf()

    fun addListener(_modeListener: ModeListener){
        listeners.add(_modeListener)
    }

    fun onModeChange(_mode: Mode){
        for (listener in listeners){
            listener.onModeChange(_mode)
        }
    }

}

2-3) 모드 변경에 필요한 스위치

class ModeSwitch {
    var mode : Mode = Mode.LIST
    private var modeMediator : ModeMediator? = null


    fun setModeMediator(_modeMediator: ModeMediator){
        modeMediator = _modeMediator
    }

    fun toggleMode(){
        mode = if(mode==Mode.LIST){
            Mode.GALLERY
        }else{
            Mode.LIST
        }
        if(modeMediator != null){
            modeMediator!!.onModeChange(mode)
        }
    }

}


enum class Mode {LIST , GALLERY}

 

3. 결과

        val modeSwitch = ModeSwitch()
        val modeMediator = ModeMediator()
        modeSwitch.setModeMediator(modeMediator)
        modeMediator.addListener(ListView())
        modeMediator.addListener(GalleryView())
        modeMediator.addListener(DataDownloader())

        modeSwitch.toggleMode()
        modeSwitch.toggleMode()

 

 

'OOP > 디자인 패턴' 카테고리의 다른 글

composite 패턴  (0) 2021.07.18
DI (Dependency Injection/의존성 주입)  (0) 2021.07.17
abstract-factory method 패턴  (0) 2021.07.08
Factory 패턴  (0) 2021.07.07
Decorator 패턴  (0) 2021.07.05