티스토리 뷰

Swift/디자인패턴

Observer Pattern(swift)

Clover(린생) 2018. 6. 8. 13:56
안녕하세요. 린생입니다.

오늘은 Swift Design Pattern 중 Observer Pattern을 소개하겠습니다.

번역을 하자면 Observer -> 관찰자라고 번역 할 수 있습니다.

왜 관찰자 일까요??

Observer Pattern은 해당 프로퍼티가 변경 되는걸 관찰하고 있다가 변경 되는 시점에서 update가 수행 되게 되는 형태를 말합니다.

쉽게 설명을 하자면 제가 지금 한 대상을 보고 있다가 그 대상이 어떻게 하는지를 보고 있다가 그 대상이 변화가 일어나면 제가 행동을 하는 것입니다.

우리가 코드를 만들다 보면 특정 값이 변경이 발생 할 때 다른 연쇄적으로 그 값을 참조 하고 하고 있는 값들이 자동 적으로 변경이 이루어 져야 될 때 사용 하면 유용한 패턴입니다.

그러면 코드로 생성 해 볼까요?

먼저 프로토콜을 생성 해줍니다.

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

그리고 대상을 객체를 만들어줍니다.

class Subject {
    private var observers: [Observer] = [Observer]()
    private var value: Int = Int()

    // 변경을 되면 notify()를 호출
    var number: Int {
        set {
            value = number
            notify()
        }
        get {
            return value 
        }
    }

    // 옵저버 등록
    func attachObserver(_ observer: Observer) {
        observers.append(observer)
    }
    
    // 옵저버 알림
    func notify() {
        for observer in observers {
            observer.update(number)
        }
    }
}

처음 옵저버 패턴을 공부하시는 분들께서는 이 부분이 잘 이해가 되지 않을 거같습니다.

일단 이 Subject class를 설명 하자면 이 클래스는 관찰자들이 보고 있는 대상입니다.
즉 이 값의 value가 변경이 이루어 지면 observer들은 모두 그것을 인지할 수 있는 것입니다.

그래서 var number 에서 set 에 notify() 함수를 호출하게 됩니다.

이제 그러면 옵저버들을 생성 하겠습니다.

class Linsaeng: Observer {
    private var subject: Subject = Subject()
    
    init(_ subject: Subject) {
        self.subject = subject
        self.subject.attachObserver(self)
    }

    func update(_ notifyValue: Int) {
        print(“린생이 \(notifyValue)” 값으로 변경 된 것을 인식 하였습니다.)
    }
}

classclass Harry: Observer {
    private var subject: Subject = Subject()
    
    init(_ subject: Subject) {
        self.subject = subject
        self.subject.attachObserver(self)
    }

    func update(_ notifyValue: Int) {
        print(“해리가 \(notifyValue)” 값으로 변경 된 것을 인식 하였습니다.)
    }
}

옵저버들에게는 생성 될 때 관찰 대상을 넣어주고 초기화를 해주고 update 함수에서 필요한 작업을 하면 됩니다.

이제 main 함수에서 실행을 해볼까요?

func main() {
    let subject = Subject()
    let _ = Linsaeng(subject)
    let _ = Harry(subject)

    subject.number = 2    // 린생이 2 값으로 변경 된 것을 인식 하였습니다.
                          // 해리가 2 값으로 변경 된 것을 인식 하였습니다.

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

이렇게 값들이 자기 저장되거나 변경 되는 순간에 Linsaeng, Harry 클래스에서 update 함수가 호출 되는 것을 확인 할 수 있습니다. ㅎㅎ


'Swift > 디자인패턴' 카테고리의 다른 글

Delegate Pattern (Swift)  (402) 2019.06.05
SingleTon Pattern(swift)  (0) 2018.07.06
Builder pattern(swift)  (2) 2018.07.03
Factory Pattern(swift)  (3) 2018.05.30
댓글