相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的「鬥爭」,而每次的結果都是灰太狼一飛沖天,伴隨著一句「我還會回來的......」。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待。灰太狼為什麼會這麼背?
很簡單,灰太狼本身就有「暴露行蹤」的屬性,羊咩咩就能知曉灰太狼要幹嘛,不背才怪呢。
為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發起了「解救灰太狼」的行動,必須要知道觀察者模式。
觀察者模式又叫做發布-訂閱模式,定義了物件間一對多的依賴關係,使得當物件狀態發生變化時,所有依賴它的物件都會收到通知並且自動更新自己。
1)被觀察者需要持有乙個或者多個觀察者物件。
2)系統中乙個模組的變化,某些模組也會跟隨著變化。
從上面的uml可以看出來,觀察者模式設計到的角色有如下四個:
- 抽象被觀察者角色:定義了動態增加、刪除以及通知觀察者物件的方法,職責就是管理和通知觀察者。持有觀察者物件的集合。
- 具體被觀察者角色:一般繼承抽象被觀察者,實現自己本身的業務邏輯,當狀態發生改變時發起通知。
- 抽象觀察者角色:提供乙個介面,定義了觀察者收到通知時更新自己的方法。
- 具體觀察者角色:實現抽象觀察者介面,處理不同具體觀察者的不同業務邏輯。
灰太狼具有被觀察者屬性,喜洋洋這些羊咩咩一直都在觀察者灰太狼,所以羊咩咩們是觀察者。ok,角色確定了,看看具體是怎麼實現的...
抽象被觀察者**如下:
public abstract class subject
/*** 刪除觀察者
** @param observer
*/public void dettach(observer observer)
/*** 通知所有觀察者
*/public void notifyobserver
() }
}複製**
灰太狼是具體被觀察者,繼承抽象被觀察者,**如下:
public class wolf extends subject
}複製**
抽象觀察者**如下:
public inte***ce observer
複製**
喜羊羊是具體觀察者,實現抽象觀察者,**如下:
public class pleasantsheep implements observer
/*** 具體業務邏輯
*/@override
public void update(string msg)
}複製**
接下來看客戶端如何把觀察者模式跑起來,**如下:
public class client
}複製**
執行客戶端**,結果如下:
增加了觀察者:喜羊羊看到了吧,灰太狼這不是自找虐嗎!搞事情還要發通知,活該被平底鍋拍飛。灰太狼不止通知了喜羊羊,還通知了懶羊羊。灰太狼:我要搞事情了
喜羊羊收到通知:灰太狼要搞事情了
懶羊羊也是具體觀察者,**如下:
public class lazysheep implements observer
@override
public void update(string msg)
}複製**
客戶端**如下:
public class client
}複製**
上面客戶端**建立了乙個懶羊羊觀察者,新增了觀察者集合中,這樣懶羊羊也會受到通知,執行結果如下:
增加了觀察者:喜羊羊那如何幫助灰太狼擺脫這個命運呢,把觀察者從集合中移除就ok了,**如下:增加了觀察者:懶羊羊
灰太狼:我要搞事情了
喜羊羊收到通知:灰太狼要搞事情了
懶羊羊收到通知:灰太狼要搞事情了
public class client
}複製**
再次執行客戶端,結果如下:
增加了觀察者:喜羊羊可以看到,把喜羊羊從觀察者集合中移除了,它就不會再收到通知。增加了觀察者:懶羊羊
灰太狼:我要搞事情了
喜羊羊收到通知:灰太狼要搞事情了
懶羊羊收到通知:灰太狼要搞事情了
刪除了觀察者:喜羊羊
灰太狼:我要搞事情了
懶羊羊收到通知:灰太狼要搞事情了
1)觀察者和被觀察者之間抽象耦合。觀察者模式容易擴充套件,被觀察者只持有觀察者集合,並不需要知道具體觀察者內部的實現。
2)物件之間的保持高度的協作。當被觀察者發生變化時,所有被觀察者都會通知到,然後做出相應的動作。
1)如果觀察者太多,被觀察者通知觀察者消耗的時間很多,影響系統的效能。
2)當觀察者集合中的某一觀察者錯誤時就會導致系統卡殼,因此一般會採用非同步方式。
跟**模式對比:觀察者模式和**模式主要區別在它們功能不一樣,觀察者模式強調的是被觀察者反饋結果,而**模式是同根負責做同樣的事情。
,下回分解,再見。
java設計模式 觀察者模式
本例以貓和老鼠來講解觀察者,首先定義觀察者為 老鼠和主人,被觀察者為貓,如下 public inte ce observer public class event public string getname public class mouse implements observer public ...
Java設計模式 觀察者模式
在物件之間定義一對多的依賴關係,這樣一來,當乙個物件改變狀態,依賴它的物件都會收到通知,並自動更新。比如有乙個天氣的資料來源,和需要獲取天氣資料的觀察者。天氣資料不定時更新。而觀察者也是隨時訂閱和取消訂閱天氣資料來源。在訂閱時,希望每次天氣資料更新時觀察者都可以獲取資訊。天氣資料來源作為被觀察的主題...
Java設計模式 觀察者模式
觀察者模式是乙個使用率非常高的的模式,它是一套訂閱 發布系統,這個模式最重要的作用就是將訂閱者和被訂閱者解耦。定義物件間一種對多種的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知。subject 抽象主題類,也就是被觀察者 observable 把所有觀察者物件儲存在乙個集合裡...