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 |