관찰 중인 객체에서 발생하는 이벤트를 여러 다른 객체에 알리는 메커니즘을 정의할 수 있는 디자인 패턴

Model은 ViewController의 타입에 대해 알 필요 없이 상태가 변경될 때마다 이를 ViewController에 전달가능
→ 여러 개의 ViewController가 하나의 Model의 변경사항 사용
장점
단점
Publisher 인터페이스 정의
정의해야할 프로토콜
// Subject(Publisher) Interface
protocol Publisher {
var observers: [Observer] { get set }
func subscribe(observer: Observer)
func unSubscribe(observer: Observer)
func notify(message: String)
}
Observer(Subscriber) 프로토콜을 정의
// Observer(Subscriber) Interface
protocol Observer {
var id: String { get set }
func update(message: String)
}
Publisher 역할을 하는 Apple Store 클래스를 정의
// Concrete Subject(Publisher)
class AppleStore: Publisher {
var observers: [Observer]
init(observers: [Observer]) {
self.observers = observers
}
func subscribe(observer: Observer) {
self.observers.append(observer)
}
func unSubscribe(observer: Observer) {
if let index = self.observers.firstIndex(where: { $0.id == observer.id }) {
self.observers.remove(at: index)
}
}
func notify(message: String) {
for observer in observers {
observer.update(message: message)
}
}
}
AppleStore의 알람을 수신할 Customer 클래스도 정의
// Concrete Observer(Subscriber)
class Customer: Observer {
var id: String
init(id: String) {
self.id = id
}
func update(message: String) {
print("\(id)님 \(message)수신\n")
}
}
구현
let appleStore = AppleStore(observers: [])
let pingu = Customer(id: "Pinggu")
let pinga = Customer(id: "Pingga")
let roby = Customer(id: "Roby")
appleStore.subscribe(observer: pingu)
appleStore.subscribe(observer: roby)
appleStore.notify(message: "iPhone 재고 입고 ")
appleStore.unSubscribe(observer: roby)
appleStore.notify(message: "iPhone 재고 입고 ")