Observer Pattern์ ํด๋น ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ ๋๋๊ฑธ ๊ด์ฐฐํ๊ณ ์๋ค๊ฐ ๋ณ๊ฒฝ ๋๋ ์์ ์์ update๊ฐ ์ํ ๋๊ฒ ๋๋ ํํ๋ฅผ ๋งํ๋ค. Delegate Pattern์ 1:1 ๊ด๊ณ์ ๋ค๋ฅด๊ฒ, ๊ฐ์ฒด๊ฐ์ 1:N ์์กด ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ํจํด์ด๋ค.
ํน์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋ฐ์ ํ ๋ ๋ค๋ฅธ ์ฐ์์ ์ผ๋ก ๊ทธ ๊ฐ์ ์ฐธ์กฐ ํ๊ณ ํ๊ณ ์๋ ๊ฐ๋ค์ด ์๋ ์ ์ผ๋ก ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด ์ ธ์ผ ๋ ๋ ์ฌ์ฉ ํ๋ฉด ์ ์ฉํ๋ค.
๋ฐ๋ผ์, NotificationCenter์ ์กด์ฌ ์ด์ ๊ฐ ๋น์ทํ๋ค(์์ธํ ๊ฑด ํ๋จ์์).
-
Observerable ํ ํจํด์ ์ํด ํ๋กํ ์ฝ์ ํตํ ์ ๊ทผ ๋ฐฉ์ ์ ์
// MARK: -Observerable Protocol protocol Observer { var id: Int { get } func update() }
-
Subject ํด๋์ค: ๊ฐ์ฒด์๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฆฌ๋ ์ญํ
์ต์ ๋ฒ๋ฅผ attachํ๋ฉด, ์ด๋ฅผ ObserverArray์ ๋ฃ๋๋ค.
๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ notifyํ๊ฒ ๋๋ฉด ์ด ObserverArray๋ฅผ ์ํํ๋ฉฐ Observer Protocol ๋ด update() ํจ์๋ฅผ ํธ์ถํ๋ค.
class Subject { private var observerArray = [Observer]() private var _number = Int() // number๋ณ์๊ฐ ์ด๊ธฐํ๋๋ฉด notify var number: Int { set { _number = newValue notify() } get { return _number } } // ์ต์ ๋ฒ ๋ฑ๋ก func attachObserver(observer: Observer) { observerArray.append(observer) } // ๋ฑ๋ก๋ ์ต์ ๋ฒ๋ค์๊ฒ notify private func notify() { for observer in observerArray { observer.update() } } }
- ํ๋ก์ฝํจ ์ฑํ
// 2์ง์ ๋ณํ class BinaryObserver: Observer { private var subject = Subject() var id = Int() init(subject: Subject, id: Int) { self.subject = subject self.subject.attachObserver(observer: self) // ์ต์ ๋ฒ ๋ฑ๋ก self.id = id } func update() { print("\(subject.number)์ 2์ง์ ๋ณํ: \(String(subject.number, radix:2))") } } // 16์ง์ ๋ณํ class HexObserver: Observer { private var subject = Subject() var id = Int() init(subject: Subject, id: Int) { self.subject = subject self.subject.attachObserver(observer: self) // ์ต์ ๋ฒ ๋ฑ๋ก self.id = id } func update() { print("\(subject.number)์ 16์ง์ ๋ณํ: \(String(subject.number, radix:16))") } } // 8์ง์ ๋ณํ class OctaObserver: Observer { private var subject = Subject() var id = Int() init(subject: Subject, id: Int) { self.subject = subject self.subject.attachObserver(observer: self) // ์ต์ ๋ฒ ๋ฑ๋ก self.id = id } func update() { print("\(subject.number)์ 8์ง์ ๋ณํ: \(String(subject.number, radix:8))") } }
- notify
let subject = Subject() let binary = BinaryObserver(subject: subject, id: 1) let octa = OctaObserver(subject: subject, id: 2) let hex = HexObserver(subject: subject, id: 3) subject.number = 15 // notify subject.number = 2 // notify
- output
15์ 2์ง์ ๋ณํ: 1111 15์ 8์ง์ ๋ณํ: 17 15์ 16์ง์ ๋ณํ: f 2์ 2์ง์ ๋ณํ: 10 2์ 8์ง์ ๋ณํ: 2 2์ 16์ง์ ๋ณํ: 2
Observer Pattern์ observer๋ฅผ ๋ฑ๋กํ๊ณ notification์ postํ๋ค๋ ๋ฐ์ ์์ด์ NotificationCenter์ ๊ทธ ๋์ ๋ฐฉ์์ด ๋น์ทํ๋ค.
๊ทธ๋ผ ๋ญ๊ฐ ๋ค๋ฅผ๊น? NotificationCenter๋ Observer Pattern์ ๊ฐ๋ ์ ๊ตฌํํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ NotificationCenter๋ ๊ธฐ์กด Observer Pattern์์ observer๋ฅผ ๋ฑ๋กํ๊ณ notification์ ์ฃผ๋ ์ญํ ๋ง ๋นผ์ ์ถ์ํ ๋ ๋ฒจ์ ์ฌ๋ฆฐ ๊ตฌํ์ฒด๋ผ๋ ์ฐจ์ด์ ์ด ์๋ค.