본문 바로가기
Object-Oriented Programming/Design Pattern

Observer Pattern, 옵저버 패턴

by yongmin.Lee 2022. 8. 8.

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

https://johngrib.github.io/wiki/pattern/observer/