[swift] Observer 디자인 패턴

Observer 패턴은 소프트웨어 디자인에서 많이 사용되는 패턴 중 하나입니다. 이 패턴은 객체 간에 일대다 의존성을 정의할 때 유용합니다. 한 객체의 상태가 변경되면 이 객체에 의존하는 다른 객체들이 자동으로 업데이트된다는 아이디어에 기반하고 있습니다.

Observer 패턴 구성

Observer 패턴은 주로 Subject(주제)와 Observer(구독자)로 구성됩니다. Subject는 모니터링 대상입니다. Observer는 Subject의 상태 변화를 감지하고 이에 따라 특정 동작을 수행합니다.

예제 코드

// Subject 프로토콜 정의
protocol Subject {
    func registerObserver(observer: Observer)
    func removeObserver(observer: Observer)
    func notifyObservers()
}

// Observer 프로토콜 정의
protocol Observer {
    func update()
}

// 구체적인 Subject 클래스 구현
class ConcreteSubject: Subject {
    private var observers = [Observer]()

    func registerObserver(observer: Observer) {
        observers.append(observer)
    }

    func removeObserver(observer: Observer) {
        if let index = observers.firstIndex(where: { $0 === observer }) {
            observers.remove(at: index)
        }
    }

    func notifyObservers() {
        for observer in observers {
            observer.update()
        }
    }
}

// 구체적인 Observer 클래스 구현
class ConcreteObserver: Observer {
    func update() {
        print("상태가 변경되었습니다.")
    }
}

// 사용 예
let subject = ConcreteSubject()
let observer1 = ConcreteObserver()
let observer2 = ConcreteObserver()

subject.registerObserver(observer: observer1)
subject.registerObserver(observer: observer2)

subject.notifyObservers()

요약

Observer 패턴은 객체 간에 느슨한 결합을 유지하며, 한 객체의 상태 변화에 따라 다른 객체들이 변경 사항을 수신하고 이에 반응할 수 있도록 하는 데 사용됩니다. 이 패턴을 사용하면 객체 간의 의존성을 줄이고 확장성과 유연성을 향상시킬 수 있습니다.

참고 자료