定義:
定義對象之間的一種一對多的依賴關系,使得每當一個對象的狀態發生變化時,其相關的依賴對象都可以得到通知並被自動更新。
模式主要用於多個不同的對象對一個對象的某個方法會做出不同的反應!
比如貓叫之后狗會叫老鼠會逃跑,這時候貓就是被觀察者,老鼠和狗都是觀察者。
角色:
- 抽象目標:這是被觀察的對象(抽象)
- 這是核心,里面需要一個成員屬性變量存儲所有的觀察者,需要定義add和remove觀察者的方法,需要給出notify方法通知所有的觀察者對象。
- 具體目標(具體的被觀察者):貓繼承抽象目標類,實現里面的方法,寫出貓的反應,並且循環輸出所有觀察者的反應。
- 抽象觀察者:接口,定義響應方法。
- 具體觀察者:實現抽象觀察者方法,重寫響應方法。
- 客戶端調用:先使用具體目標對象的add方法添加具體觀察者對象,然后調用其notify方法通知觀察者。
核心理解
觀察者模式做的事情是這樣的:
有這么一個場景,比如說一個對象的某個變化會造成其他類的不同的反應,比如說股票的漲跌和股民的狀態就是一種動態的關聯變化,觀察者模式就是來描述這樣的一個場景的!
具體是這樣完成的:
根據依賴倒轉原則,首先需要一個抽象的被觀察的類,這個類擁有的成員屬性變量是和它有關系的那些觀察者對象,一般是有多個對象,如果這個屬性是一個集合,那么需要定義兩個接口方法,一個增加一個刪除,最后還需要一個描述自身狀態的方法。
具體的被觀察者繼承自抽象的被觀察類, 這個類重寫它的狀態變化方法!注意這個方法需要遍歷所有觀察者對象的response方法
觀察者同樣也需要進行抽象,需要一個觀察者接口類,這個類只有一個方法就是response()
具體的觀察者實現這個接口,重寫response方法!
客戶端在調用時,需要把觀察者添加到被觀察者里,然后調用被觀察者的狀態變化方法,就會看到它所有的觀察者對這個狀態做出的不同的反應!