본문 바로가기
Swift

Swift에서 옵저버 패턴(Observer Pattern)의 개념과 예제

by mr.conan 2023. 6. 15.
728x90
반응형

옵저버 패턴(Observer Pattern)은 소프트웨어 개발에서 사용되는 디자인 패턴 중 하나입니다. Swift에서도 옵저버 패턴을 활용하여 객체 간의 느슨한 결합을 구현할 수 있습니다. 이 블로그 포스트에서는 옵저버 패턴의 개념을 소개하고, Swift로 구현된 예제를 통해 옵저버 패턴의 사용법을 알아보겠습니다.

옵저버 패턴의 개념: 옵저버 패턴은 객체 간의 일대다(one-to-many) 의존 관계를 정의합니다. 하나의 주체(Subject) 객체의 상태가 변경될 때, 의존하는 여러 개의 옵저버(Observer) 객체들에게 알림을 보내고 업데이트를 수행합니다. 옵저버 패턴을 사용하면 주체와 옵저버 사이의 결합도를 낮추고, 유연하고 확장 가능한 코드를 작성할 수 있습니다.

 

옵저버 패턴 예제:

protocol Observer: AnyObject {
    func update()
}

class Subject {
    private var observers: [Observer] = []

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

    func detach(observer: Observer) {
        observers.removeAll { $0 === observer }
    }

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

class ConcreteObserver: Observer {
    private let name: String

    init(name: String) {
        self.name = name
    }

    func update() {
        print("\(name) received an update.")
    }
}

위의 예제에서는 Observer 프로토콜을 정의하고, Subject 클래스가 옵저버들을 관리합니다. attach(observer:) 메서드를 통해 옵저버를 추가하고, detach(observer:) 메서드를 통해 옵저버를 제거할 수 있습니다. notify() 메서드는 주체의 상태 변경 시 모든 옵저버에게 업데이트를 알리는 역할을 수행합니다.

 

ConcreteObserver 클래스는 Observer 프로토콜을 구현한 구체적인 옵저버입니다. update() 메서드는 업데이트를 수신할 때 호출되며, 각 옵저버는 자신의 업데이트를 처리합니다.

 

사용 예시:

let subject = Subject()

let observerA = ConcreteObserver(name: "Observer A")
let observerB = ConcreteObserver(name: "Observer B")

subject.attach(observer: observerA)
subject.attach(observer: observerB)

subject.notify()

subject.detach(observer: observerA)

subject.notify()

위의 예시에서는 Subject 인스턴스를 생성하고, ConcreteObserver로 구현된 옵저버를 추가합니다. notify() 메서드를 호출하여 모든 옵저버에게 업데이트를 알립니다. 그 후 detach(observer:) 메서드를 사용하여 옵저버 A를 제거하고 다시 업데이트를 알립니다.

728x90
반응형