-
Notifications
You must be signed in to change notification settings - Fork 12
/
ObserverPattern.md
126 lines (94 loc) · 2.35 KB
/
ObserverPattern.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
## 样例
![](http://blog.oldbird.run/mweb/16176017312597.jpg)
```swift
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
print("\n输入10")
subject.state = 10
```
结果显示:
```swift
输入5:
十六进制: 5
八进制: 5
二进制: 101
输入10
十六进制: A
八进制: 12
二进制: 1010
```