Observer Pattern
- 정의
- 객체의 상태 변화를 관찰하는 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
- Observer 등록시 순서나 갯수 등에 특정 로직이 의존하지 않도록 Subject와 Observer가 느슨한 결합을 갖는 것이 중요
- Observer의 행위가 Subject에 영향을 주는 로직이 있다면, 무한 루프가 발생할 수 있으므로 주의
- 활용
- 사용자 입력같은 외부에서 발생한 이벤트에 대한 응답을 처리
- 비즈니스로직에 의해 상태변경시마다 뷰에 업데이트 할때 활용
- 구조
- Subject : Observer을 등록 및 해지하고 상태변경시 리스트의 Observer들에게 통지하는 객체
- Observer : Observer는 update()함수를 구현하여 이벤트가 발생했을 때 처리할 각자의 동작을 정의
Observer Pattern 예시
protocol Observer {
var id { get set }
func update()
}
class ObserverImpl: Observer {
var id: String
init(value: Int) {
self.id = "\(NSDate().timeIntervalSince1970)"
}
func update() {
print(id + " observer update")
}
}
protocol Subject {
func registerObserver(observer: Observer)
func unregisterObserver(observer: Observer)
func notify()
}
class SubjectImpl: Subject {
var observerList: [Observer]
init() {
self.observerList = .init()
}
func registerObserver(observer: Observer) {
self.observerList.append(observer)
}
func unregisterObserver(observer: Observer) {
for (idx, observerItem) in self.observerList.enumerated() {
if observer.id == observerItem.id {
self.observerList.remove(at: idx)
break
}
}
}
func notify() {
self.observerList.forEach { observer in
observer.update()
}
}
}
참고
https://gyoogle.dev/blog/design-pattern/Observer%20Pattern.html
https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4
'Object-Oriented Programming > Design Pattern' 카테고리의 다른 글
State Pattern, 상태패턴 (0) | 2022.08.02 |
---|---|
Adapter Pattern, 어댑터 패턴 (0) | 2022.07.29 |
Composite Pattern, 컴포지트 패턴 (0) | 2022.07.28 |
Decorator Pattern, 데코레이터 패턴 (0) | 2022.07.19 |
Proxy pattern, 프록시패턴 (0) | 2022.07.19 |