设计模式-观察者模式

观察者模式是一种订阅模式, 可在被观察的对象事件发生时通知多个 “观察” 该对象的其他对象。这个就像 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