觀察者模式,其實(shí)就是觀察者和被觀察者之間的通信抽莱。
直接上代碼吧,理論先不講了:
首先定義觀察者和被觀察者的接口骄恶。
觀察者里面比較簡單食铐,就定義了一個(gè)更新數(shù)據(jù)的接口;
被觀察者里面有三個(gè)方法僧鲁,分別是添加觀察者虐呻,移除觀察者,和通知觀察者寞秃;
觀察者實(shí)現(xiàn)觀察者接口的更新的方法斟叼,這里只打印一下接收到的信息。
被觀察者分別實(shí)現(xiàn)添加春寿,更新和通知觀察者三個(gè)方法犁柜,除此以外,還要寫一個(gè)集合(List)來存放觀察者堂淡。構(gòu)造方法沒什么可說的了馋缅,添加和刪除觀察者也就是list的add和remove,最后一個(gè)notifyOberver() 這個(gè)方法通知觀察者绢淀,首先遍歷一點(diǎn)觀察者的List萤悴,確保能夠通知到每一個(gè)觀察者,然后調(diào)用觀察者的update的方法皆的。
最后寫一個(gè)測試類覆履。
接下里看測試類:
line7,定義一個(gè)被觀察者费薄,ling9-ling11硝全,添加兩個(gè)觀察者(不要問我為什么一個(gè)觀察者要搞一個(gè)對(duì)象去接收,一個(gè)卻直接new楞抡,往后看你就明白了伟众!哈哈!)召廷,ling13凳厢,通知觀察者,然后看輸出的打印臺(tái)竞慢,打印臺(tái)上是不是能夠接收到兩句被觀察者發(fā)出的消息先紫,這就對(duì)了嘛,因?yàn)橛^察者有兩個(gè)筹煮,說明兩個(gè)觀察者都接收到了被觀察者發(fā)出的消息遮精。
line15,移除了一個(gè)觀察者(這里就是為什么前面一個(gè)用對(duì)像去接收败潦,一個(gè)卻直接new本冲,因?yàn)槲抑苯觧ew的話,就沒辦法移除了变屁,哈哈Q劭 ),然后看line17粟关,通知觀察者疮胖,再看控制臺(tái)的輸出,控制臺(tái)的輸出 "this is message_2!" ?是不是只輸出了一次闷板,這就對(duì)了嘛澎灸,因?yàn)橛^察者已經(jīng)被我移除掉了一個(gè),就只剩下一個(gè)了遮晚,自然也就只能打印出來一個(gè)咯性昭!