옵저버 (Observer, 또는 Notification) 디자인패턴

옵저버(Observer) 또는 알림(Notification) 디자인 패턴은 객체의 상태 변경을 관찰하고, 관찰자에게 변경 사항에 대한 알림을 전송하는 패턴입니다. Swift에서 NotificationCenter를 사용하여 이 패턴을 구현할 수 있습니다. 아래 예제를 살펴보겠습니다:

import Foundation

// 알림 이름 정의
extension Notification.Name {
    static let dataUpdated = Notification.Name("dataUpdated")
}

class DataProvider {
    private(set) var data: String = "" {
        didSet {
            // 데이터가 변경되면 알림을 전송
            NotificationCenter.default.post(name: .dataUpdated, object: self)
        }
    }

    func updateData() {
        // 새 데이터를 얻어옴 (예시를 위해 랜덤 문자열 사용)
        let newData = UUID().uuidString
        data = newData
    }
}

class DataObserver {
    private var dataUpdateObserver: NSObjectProtocol?

    init() {
        // 알림 구독
        dataUpdateObserver = NotificationCenter.default.addObserver(forName: .dataUpdated, object: nil, queue: .main) { [weak self] _ in
            self?.handleDataUpdate()
        }
    }

    deinit {
        if let observer = dataUpdateObserver {
            NotificationCenter.default.removeObserver(observer)
        }
    }

    func handleDataUpdate() {
        print("Data updated!")
    }
}

// 사용 예시
let dataProvider = DataProvider()
let dataObserver = DataObserver()

dataProvider.updateData() // 출력: Data updated!

위 예제에서 DataProvider 클래스는 데이터를 저장하고 업데이트하는 책임이 있는 클래스입니다. 데이터가 변경되면 NotificationCenter를 통해 알림을 전송합니다. 알림을 전송할 때는 알림 이름으로 dataUpdated를 사용합니다.

DataObserver 클래스는 데이터 변경을 관찰하고 처리하는 책임이 있는 클래스입니다. 이 클래스의 인스턴스가 생성될 때 NotificationCenter를 사용하여 dataUpdated 알림을 구독합니다. 데이터가 업데이트되면 handleDataUpdate() 메서드가 호출됩니다.

이 예제는 옵저버 디자인 패턴을 사용하여 객체 상태 변경을 관찰하고 관찰자에게 알림을 전송하는 방법을 보여줍니다. 이 패턴은 객체 간의 결합도를 낮추고 코드의 유연성과 확장성을 향상시키는 데 도움이 됩니다.

One thought on “옵저버 (Observer, 또는 Notification) 디자인패턴

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다