以上是API手冊里觀察者的UML圖,(本文主要討論自己實現觀察者模式,JDK內置的就自己百度下吧)從上圖中我們可以看出一共需要兩個接口,兩個具體的實現類,分別是觀察者接口,觀察者實現類,被觀察者接口,被觀察者實現類,并且被觀察者中會有多個觀察者,因此我們想到的是用一個集合框架來儲存觀察者(例如List),也就是使用組合啦。 下面的東西通過具體代碼來解析給大家聽。 場景是有一條變色龍,然后有一堆人在猥瑣地注視著它(好可憐哇。。。),當變色龍變色的時候,所有人要將新的顏色記錄下來。 首先是觀察者接口
這里代碼不做多解析,強轉的那個地方也是為了應變需求改變,萬一以后不僅僅要記錄變色龍,還要記錄鸚鵡什么的,那接口的代碼也就不需要改變了。 然后是被觀察者接口
這里前兩個方法為的就是添加觀察者和除去觀察者唄,通知方法就是當狀態改變的時候,要告知所有的觀察者,這里可能有點懵,看了實現類就很容易懂了。 下面是被觀察者實現類
在這里,color就是被觀察者的狀態啦,當這個狀態改變的時候就必須告訴所有的觀察者,所以changeColor里面需要調用notifyAllObserver 下面是主函數
匿名類的寫法相信大家一定非常熟悉了,很像SWING里面的addListener,很方便,遺憾的是,不能知道名字,也沒辦法remove了。 結果是
變色龍將顏色變為:黃色 hjq記錄了變色龍的顏色為:黃色 zz記錄了變色龍的顏色為:黃色 變色龍將顏色變為:紅色 hjq記錄了變色龍的顏色為:紅色 無名氏記錄了變色龍的顏色為:紅色
大家多多支持。。以后會推出更多的設計模式的代碼,力求簡單生動,易于理解。。