## 28.觀察者模式
面向對象編程是根據現實世界建模的。 這里,對象需要彼此通信,其他對象需要在一個對象狀態改變時做出反應。 假設你遇到一種情況,即對象的狀態更改需要傳播到 n 個其他對象,這些其他對象稱為觀察者。 當事情發生變化時,如何編寫整潔的代碼來通知觀察者? 歡迎使用觀察者模式。
看一下 [rator.rb](code/design_patterns/observer.rb) ,代碼清單如下所示
```rb
```
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
```rb
|
```
# observer.rb
class Person
attr_accessor :name, :status, :observers
def initialize name
@name = name
@observers =[]
end
def set_status status
@status = status
notify_observers
end
def notify_observers
for observer in observers
observer.notify self
end
end
def notify person
puts "#{person.name}: #{person.status} - notified to #{@name}"
end
end
vel = Person.new "Vel"
vel.observers << Person.new("Murugan")
vel.observers << Person.new("Swami")
vel.set_status "Hello All!"
```rb
|
```
在上面的代碼中看看這些行
```rb
vel = Person.new "Vel"
vel.observers << Person.new("Murugan")
vel.observers << Person.new("Swami")
```
因此,從上面的代碼中我們知道,有一個名叫 Vel 的人被 Murugan 和 Swami 觀察到。 想象一下一個社交網絡,Vel 之后是 Murugan 和 Swami。 因此,我們在`Person`中有一個稱為`observers`的屬性,它不過是一個可以容納盡可能多觀察者的數組。
如果查看 [Observer.rb](code/design_patterns/observer.rb) ,你會注意到它已在以下幾行中完成
```rb
class Person
attr_accessor :name, :status, :observers
def initialize name
@name = name
@observers =[]
end
...
end
```
接下來看這條線
```rb
vel.set_status "Hello All!"
```
在其中,我們設置 Vel 的狀態。 運行程序時,將得到以下輸出:
```rb
Vel: Hello All! - notified to Murugan
Vel: Hello All! - notified to Swami
```
因此,你可以看到觀察者已收到有關 Vel 的新狀態的通知。 如何完成的? 如果查看 [viewer.rb](code/design_patterns/observer.rb) ,則在方法`set_status`中我們將調用方法`notify_observers`,在其中發生了魔術。
看看`notify_observers`方法
```rb
class Person
...
def notify_observers
for observer in observers**(1)**
observer.notify self**(2)**
end
end
...
end
```
在其中發生以下情況
| **1** | 我們遍歷每個觀察者。 |
| **2** | 我們在觀察者中調用`notify`方法并傳遞更改后的對象。 |
由于觀察者都是`Person`類型的,所以我們在與`notify`方法相同的類中編寫了代碼,請看下面的代碼。 在里面
```rb
class Person
...
def notify person**(1)**
puts "#{person.name}: #{person.status} - notified to #{@name}"**(2)**
end
end
```
| **1** | `notify`接收更改的對象,在這種情況下為`person`。 |
| **2** | 它對更改后的對象有作用。 |
這就是觀察者模式的工作方式。 我們有存儲觀察者的方法,有一個通知觀察者的方法,當需要進行通知時會調用該方法,最后我們有一個方法是觀察者來接收更改的對象。 觀察者可以對更改后的對象執行其希望的操作。
| | 實際上,當你使用 Ruby 時,觀察者模式會直接放入其標準庫中。 看看這個 https://ruby-doc.org/stdlib-2.7.0/libdoc/observer/rdoc/Observable.html |
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書