옵저버 패턴 [Observer Pattern] (Swift)

Tabber·2021년 8월 22일
2

디자인패턴

목록 보기
1/2

옵저버 패턴?

Observer Pattern 이란 무엇일까?
일단 Observer 의 뜻은 관찰자이다. 관찰자? 갑자기 왜 관찰자가 나오는 걸까?

옵저버 패턴은 원하는 작업이 변경되는 것을 관찰하고 있다가, 관찰하는 작업이 변경될 때 원하는 작업을 수행하게 하는 형태를 말한다.

값이 변경됨에 따라 피드백에 바로 나와야 하는 프로그램에 사용하면 정말 좋을 듯한 패턴이다.

그럼 옵저버 패턴을 코드로 구현해보자.

먼저 옵저버를 정의하는 프로토콜을 생성해준다.

protocol Observer {
	func update(_ notifyValue: Int)
}

그리고 대상 객체를 만들어 준다.

class Subject {
    private var observers: [Observer] = [Observer]()
    private var value: Int = Int()
    
    // 변경되면 notify()를 호출
    var number: Int {
        set {
            value = newValue
            notify()
        }
        get {
            return value
        }
    }
    
    // 옵저버 등록
    func attachObserver(_ observer: Observer) {
        observers.append(observer)
    }
    
    // 옵저버 알림
    func notify() {
        for observer in observers {
            observer.update(number)
        }
    }
}

Subject 클래스는 관찰자(Observer)들이 보고 있는 대상(Observable)이다.
즉, 이 값의 value가 변경되면 관찰자들은 모두 그것을 인지할 수 있는 것이다.

코드에 보면 var number 가 변경이 이루어지면서 notify() 함수를 호출하게 된다.
update() 함수를 호출함으로써, 옵저버들은 값이 바뀌었다라는 이벤트를 얻게 되고, 이렇게 얻은 이벤트 신호를 update() 함수는 응답 이벤트에 정해놓은 행동을 하게 되는 것이다.

이제 옵저버들을 생성해보자.

class IBY: Observer {
    func update(_ notifyValue: Int) {
        print("IBY가 \(notifyValue) 값을 변경된 것을 인식하였습니다.")
    }
    
    private var subject: Subject = Subject()
    
    init(_ subject: Subject) {
        self.subject = subject
        self.subject.attachObserver(self)
    }
}

class Harry: Observer {
    private var subject: Subject = Subject()
    
    init(_ subject: Subject) {
        self.subject = subject
        self.subject.attachObserver(self)
    }
    
    func update(_ notifyValue: Int) {
        print("해리가 \(notifyValue) 값으로 변경된 것을 인식하였습니다.")
    }
}

옵저버들에게는 생성될 시 관찰할 대상을 넣어주면서 초기화를 해주고, update 함수에서 이벤트 신호를 받았을 경우 이에 맞는 작업을 하면 된다.(따라서 각 옵저버들에게 업데이트 구현을 해놓았다)

이제 실행해보자.

func main() {
    let subject = Subject()
    let _ = IBY(subject)
    let _ = Harry(subject)
    
    subject.number = 2 
    // IBY가 2 값을 변경된 것을 인식하였습니다.
    // 해리가 2 값으로 변경된 것을 인식하였습니다.

    
    subject.number = 4
    // IBY가 4 값을 변경된 것을 인식하였습니다.
    // 해리가 4 값으로 변경된 것을 인식하였습니다.
}

main()

이렇게 값이 저장되거나 변경되는 순간 각 옵저버 클래스에서 update 함수가 호출되는 것을 확인할 수 있다.

참고 블로그

https://linsaeng.tistory.com/6

profile
iOS 정복중인 Tabber 입니다.

1개의 댓글

comment-user-thumbnail
2022년 2월 20일

감사합니다! 덕분에 이해한거같아용

답글 달기