반응형
옵저버 패턴
Observe, 영어로 관찰하다 라는 뜻을 가지고 있다.
위 사진은 스타크래프트 게임에 나오는 Observer라는 관측 유닛이다.
플레이어는 위 유닛으로 상대방을 감시하여 정보를 얻어낼 수 있을 것이다.
Observer를 보여주는 이유는 옵저버 패턴도 마찬가지이기 때문이다.
옵저버 패턴은 어떤 객체의 상태 변화를 '관측'하여 연관된 객체들에게 알림을 보내는 디자인 패턴이라고 할 수 있다.
예시
예를 들어서 설명해보도록 하자.
한 유튜버가 있고, 해당 유튜버를 구독한 사람들에게
동영상이 업로드될 때마다 구독자들에게 영상 제목을 알려주도록 해보자.
interface Youtuber{
fun subscribe(subscriber: Subscriber)
fun unsubscribe(subscriber: Subscriber)
fun uploadVideo(title: String)
}
interface Subscriber{
fun update(msg: String)
}
가장 먼저 유튜버와 구독자 인터페이스를 각 선언해준다.
유튜버 인터페이스에선 구독자 추가, 제거, 영상 업로드 기능이 있고
구독자 인터페이스에선 유튜버가 올린 새 영상의 제목을 출력하는 update기능이 있다.
class Gogildong: Youtuber{
private val subscribers = mutableListOf<Subscriber>()
override fun subscribe(subscriber: Subscriber){
subscribers.add(subscriber)
}
override fun unsubscribe(subscriber: Subscriber){
subscribers.remove(subscriber)
}
override fun uploadVideo(title: String){
subscribers.forEach{it.update(title)}
}
}
다음으로 Youtuber인터페이스를 상속받는 Gogildong클래스를 하나 생성해보도록 하자.
이 클래스에선 구독자들을 list형태로 저장할 수 있으며, 영상 업로드 시 각 구독자들의 update함수를 실행한다.
class Dooly: Subscriber{
override fun update(msg: String){
println("둘리 수신 ${msg}")
}
}
class Doner: Subscriber{
override fun update(msg: String){
println("도우너 수신 ${msg}")
}
}
Subscriber인터페이스를 상속받는 Dooly와 Doner클래스에선
update함수를 oberride 하여 영상 제목을 출력하도록 한다.
이렇게 각 클래스들을 정의했다면, main함수로 가서 구독, 구독취소, 영상 업로드 등을 실행시켜보자.
fun main(){
val gildong = Gogildong()
val dooly = Dooly()
val doner = Doner()
gildong.subscribe(dooly)
gildong.subscribe(doner)
gildong.uploadVideo("종로로 갈까요")
gildong.unsubscribe(doner)
gildong.uploadVideo("명동으로 갈까요")
}
위와 같이 해당 객체의 상태가 변화하는 것을 연관된 객체들에게 알리는 것이 옵저버 패턴이다.
장단점
장점
- 느슨한 결합을 통해 유연한 시스템 개발이 가능하며, 객체 간의 의존성을 제거할 수 있다.
- push방법을 사용함으로써 직관적으로 이해하기가 쉽다.
- 실시간으로 효과적인 데이터 배분이 가능하다.
단점
- observer제거를 적절히 해주지 않으면 메모리 누수가 발생할 수 있다.
- 너무 많이 사용하면 상태 관리가 힘들 수 있다.
반응형
'Computer Science > 디자인 패턴' 카테고리의 다른 글
빌더 패턴(Builder Pattern) (0) | 2022.02.02 |
---|---|
스테이트 패턴(State Pattern) (0) | 2022.01.08 |
스트래티지 패턴(Stratagy Pattern) (0) | 2022.01.07 |
싱글톤 패턴(SingleTon Pattern) (0) | 2021.12.16 |