观察者模式是一种订阅模式, 可在被观察的对象事件发生时通知多个 “观察” 该对象的其他对象。这个就像 iOS 中的 observe,当被观察的对象变了,观察者就会收到通知,做出响应改变。
适用场景
- 当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。
- 当应用中的一些对象必须观察其他对象时, 可使用该模式。 但仅能在有限时间内或特定情况下使用。
优点
- 无需修改发布者代码就能引入新的订阅者类,符合开闭原则。
- 可以在运行时建立对象之间的联系。
缺点
class Subject {
private var observes: [Observer] = []
private var _state: Int = 0
var state: Int {
set {
_state = newValue
notify()
}
get {
return _state
}
}
func attach(observer: Observer) {
observes.append(observer)
}
func deattach(observer: Observer) {
guard let index = observes.firstIndex(where: {$0.id == observer.id}) else {return}
observes.remove(at: index)
}
func notify() {
observes.forEach { (obs) in
obs.update()
}
}
}
protocol Observer {
var id : String {get set}
var subject: Subject { get set }
func update()
}
class BinaryObserver: Observer {
var subject: Subject
var id: String
init(id: String, subject: Subject) {
self.id = id
self.subject = subject
self.subject.attach(observer: self)
}
func update() {
let val = String(subject.state, radix: 2, uppercase: true)
print("二进制: \(val)")
}
}
class OctalObserver: Observer {
var subject: Subject
var id: String
init(id: String, subject: Subject) {
self.id = id
self.subject = subject
self.subject.attach(observer: self)
}
func update() {
let val = String(subject.state, radix: 8, uppercase: true)
print("八进制: \(val)")
}
}
class HexaObserver: Observer {
var subject: Subject
var id: String
init(id: String, subject: Subject) {
self.id = id
self.subject = subject
self.subject.attach(observer: self)
}
func update() {
let val = String(subject.state, radix: 16, uppercase: true)
print("十六进制: \(val)")
}
}
let subject = Subject()
HexaObserver(id: "hexa", subject: subject)
OctalObserver(id: "octal", subject: subject)
BinaryObserver(id: "binary", subject: subject)
print("输入5:")
subject.state = 5