옵저버 패턴이란
뭔가 중요한 일이 일어났을 때 객체에게 새로운 소식을 알려 줄 수 있는 패턴
옵저버 패턴(Observer Pattern)은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다.
옵저버 패턴 특징
1. 옵저버 패턴은 객체들 사이에 일대다 관계를 정의
2. 주제는 동일한 인터페이스를 써서 옵저버에게 연락
3. Observer 인터페이스를 구현하기만 하면 어떤 구상 클래스의 옵저버라도 패턴에 참여할 수 있다.
4. 주제는 옵저버들이 Observer인터페이스를 구현한다는 것을 제외하면 옵저버에 관해 전혀 모른다. 이것이 느슨한 결합이다.
5. 옵저버 패턴을 사용하면 주제가 데이터를 보내거나(push) 옵저버가 데이터를 가져올 수(pull) 있다. 일반적으로 풀이 더 좋은 방법이다.
느슨한 결합이란?
객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계를 의미한다.
특징
1. 주제는 옵저버가 특정 인터페이스를 구현한다는 사실만 안다.
2. 옵저버는 언제든지 새로 추가할 수 있다.
3. 새로운 형식의 옵저버를 추가할 때도 주제를 변경할 필요가 전혀 없다.
4. 주제와 옵저버는 서로 독립적으로 재사용할 수 있다.
5. 주제나 옵저버가 달라져도 서로에게 영향을 미치지 않는다.
정리
상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다. 그래야 변경 사항이 생겨도 유연하게 처리할 수 있는 시스템을 구축할 수 있고, 객체 사이의 상호의존성을 최소화할 수 있기 때문이다.
옵저버 패턴 장점
- 느슨한 결합으로 인해 변경 사항이 생기더라도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다.
- Open / Close 원칙을 지킬 수 있다.(확장에는 열려있고, 변경에는 닫혀 있어야 한다.)
옵저버 패턴 단점
- Observer에게 알림이 가는 순서를 보장할 수 없다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// Observable
interface Observable {
fun notifyUpdate()
fun add(observer: Observer)
fun delete(observer: Observer)
}
// Observer
interface Observer {
fun onUpdate()
}
// Youtuber
class Youtuber : Observable {
private val observerList = mutableListOf<Observer>()
override fun notifyUpdate() {
observerList.forEach { it.onUpdate() }
}
override fun add(observer: Observer) {
observerList.add(observer)
}
override fun delete(observer: Observer) {
observerList.remove(observer)
}
}
// Subscriber
class Subscriber1 : Observer {
override fun onUpdate() {
Log.d("test!!", "구독자1 확인")
}
}
class Subscriber2 : Observer {
override fun onUpdate() {
Log.d("test!!", "구독자2 확인")
}
}
// 사용
val youtuber = Youtuber()
val subscriber1 = Subscriber1()
val subscriber2 = Subscriber2()
youtuber.add(subscriber1)
youtuber.add(subscriber2)
youtuber.delete(subscriber2)
youtuber.notifyUpdate()
|
cs |
'개발 서적' 카테고리의 다른 글
Clean Code 7장 오류 처리 (0) | 2022.06.05 |
---|---|
헤드퍼스트 디자인패턴 - 싱글턴 패턴 (0) | 2022.05.24 |
Clean Code 6장 객체와 자료 구조 (0) | 2022.05.21 |
Clean Code 5장 형식 맞추기 (0) | 2022.05.18 |
헤드퍼스트 디자인패턴 - 빌드 패턴 (0) | 2022.05.17 |