해당 예제는 Combine Framework, NotificationCenter로 구현할 수도 있다.
protocol Observer {
var id: String { get set }
func update(message: String)
}
protocol Publisher {
var observers: [Observer] { get set }
func subscribe(observer: Observer)
func unSubscribe(observer: Observer)
func notify(message: String)
}
subscribe(_:)
: 옵저버를 추가함
unSubscribe(_:)
: 옵저버를 제거
notify(_:)
: 추가된 옵저버들에게 알림을 보내는 역할
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)
}
}
}
// 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 derrick = Customer(id: "Derrick")
let 웡빙 = Customer(id: "웡빙")
let 핀 = Customer(id: "핀")
appleStore.subscribe(observer: derrick)
appleStore.subscribe(observer: 웡빙)
appleStore.notify(message: "iPhoen 15 입고!")
apple.unSubscribe(observer: 웡빙)
appleStore.notify(message: "iPad Pro 입고!")
// Derrick님 iPhone 15 입고! 수신
// 웡빙님 iPhone 15 입고! 수신
// Derrick님 iPad Pro 입고! 수신