[Design Pattern] 옵저버 패턴(Observer Pattern)

김동현·2021년 8월 24일
0

design pattern

목록 보기
3/3

옵저버 패턴이란?


우주전쟁을 해본 사람들이라면 다들 친숙한 이 녀석, 바로 옵저버다. 알다시피 옵저버(Observer)는 이름 그대로 관찰자, 감시자의 역할을 한다.
프로그래밍에서는 다양한 이벤트가 일어나는데,

이벤트의 예시는

  • 외부에서 발생한 이벤트(사용자의 키 입력)
  • 객체의 속성 값 변화

등이 있으며 이런 이벤트가 발생할 때마다 그것을 감지해 즉각적으로 처리하는 것이 옵저버 패턴의 역할이다.

옵저버 패턴의 구현


Observer Pattern의 구현시에는 2개의 class가 필요한데, 이벤트를 수신하는 class A와 이벤트의 발생시키고 전달해주는 class B이다. 이 때 중간에 이벤트의 수신해주는 interface를 두게 되고 이 녀석을 'observer'라고 부른다. kotlin에서는 'listener'라고 부르며, 이 이벤트를 넘겨주는 행위를 우리가 흔히 말하는 'callback'이라고 한다.

kotlin으로 작성하였습니다. Counter가 이벤트를 발생시키고 전달해주는 class, EventPrinter가 이벤트를 수신하는 class, Counter의 객체로 전달되는 EventListener가 interface가 됩니다.

fun main() {
    
    EventPrinter().start()
    
} 

interface EventListener {
    fun onEvent(count: Int)
}

class Counter(var listener: EventListener) {
    
    fun count() {
        for(i in 1..100) {
            if(i % 5 == 0) listener.onEvent(i)
        }
    }
}

class EventPrinter: EventListener {
    override fun onEvent(count: Int) {
        print("${count}-")
    }
    
    fun start() {
        val counter = Counter(this) // EventListener로 받음
        counter.count()
    }
}

위와 같은 방식 외에도 EventPrinter class에서 Counter가 받는 객체를 익명 객체로도 전달해줄 수 있습니다.

fun main() {
    
    EventPrinter().start()
    
} 

interface EventListener {
    fun onEvent(count: Int)
}

class Counter(var listener: EventListener) {
    
    fun count() {
        for(i in 1..100) {
            if(i % 5 == 0) listener.onEvent(i)
        }
    }
}

class EventPrinter {
    fun start() {
        var counter = Counter(object: EventListener {
            override fun onEvent(count: Int) {
                print("${count}-")
            }
        })
        counter.count()
    }
}
profile
개발을 해보자

0개의 댓글