Java設(shè)計(jì)模式探究之觀察者模式詳解
1.觀察者模式是什么
顧名思義,有兩個(gè)對(duì)象,觀察者和被觀察者。當(dāng)被觀察者數(shù)據(jù)發(fā)生變化時(shí),提醒觀察者更新數(shù)據(jù)或狀態(tài)。
2.如何實(shí)現(xiàn)
1)定義兩個(gè)類,觀察者和被觀察者。
2)被觀察者要維護(hù)一個(gè)集合,存放觀察者對(duì)象。并且提供增刪方法。
3)被觀察者數(shù)據(jù)發(fā)生變化時(shí),要調(diào)用觀察者的方法,以便通知觀察者更新數(shù)據(jù)或狀態(tài)。
4)基于面向抽象原則,可以將觀察者和被觀察者中的方法提取接口中。
3.代碼實(shí)現(xiàn)
1)觀察者接口
/** * 抽象觀察者接口 */ public interface Observer { /** * 抽象方法 */ public void uPdate(); public void remove(); }
2)被觀察者接口
/** * 抽象被觀察者 */ public interface Observed { public void addObserver(Observer observer); public void deleteObserver(Observer observer); public void notifyObservers(); }
3)觀察者實(shí)現(xiàn)
/** * 觀察者實(shí)現(xiàn) */ public class ObserverImpl implements Observer { public ObserverImpl(){ } @Override public void uPdate() { System.out.println("update...."); } }
4)被觀察者實(shí)現(xiàn)
/** * 觀察者實(shí)現(xiàn) */ public class ObserverImpl implements Observer { public ObserverImpl(){ } private Observed observed; public ObserverImpl(Observed observed){ this.observed = observed; observed.addObserver(this); } @Override public void uPdate() { System.out.println("觀察者更新數(shù)據(jù)變化...."); } @Override public void remove() { if(observed!=null){ observed.deleteObserver(this); } } }
5)測(cè)試類
public class TestObserver { public static void main(String args []){ ObservedImpl subject = new ObservedImpl(); ObserverImpl observer1 = new ObserverImpl(subject); subject.notifyObservers(); } }
4.延伸拓展
在Android的代碼中,有很多地方用到了觀察者模式。
Android的廣播機(jī)制,就是采用的觀察者模式。
我們創(chuàng)建一個(gè)廣播接收者,來(lái)接收系統(tǒng)廣播。在Android源碼中,其實(shí)就維護(hù)了一個(gè)接收者的集合,用于存放所有的廣播接收者。
到此這篇關(guān)于Java設(shè)計(jì)模式探究之觀察者模式詳解的文章就介紹到這了,更多相關(guān)Java觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Dubbo服務(wù)校驗(yàn)參數(shù)的解決方案
這篇文章主要介紹了Dubbo服務(wù)如何優(yōu)雅的校驗(yàn)參數(shù),Dubbo框架本身是支持參數(shù)校驗(yàn)的,同時(shí)也是基于JSR303去實(shí)現(xiàn)的,今天通過(guò)示例代碼介紹下詳細(xì)實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2022-03-03使用Thrift實(shí)現(xiàn)跨語(yǔ)言RPC的調(diào)用
Thrift最大的優(yōu)勢(shì)就是可以實(shí)現(xiàn)跨語(yǔ)言RPC調(diào)用,尤其在一些大廠,微服務(wù)各模塊之間使用不同的語(yǔ)言是很常見(jiàn)的,本文就將使用java作為服務(wù)端,用python作為客戶端,實(shí)現(xiàn)不同語(yǔ)言之間的RPC調(diào)用,需要的可以參考下2023-10-10java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù),感興趣的小伙伴們可以參考一下2016-02-02SpringBoot中定時(shí)任務(wù)的使用方法解析
這篇文章主要介紹了SpringBoot中定時(shí)任務(wù)的使用方法解析,@EnableScheduling?注解,它的作用是發(fā)現(xiàn)注解?@Scheduled的任務(wù)并由后臺(tái)執(zhí)行,沒(méi)有它的話將無(wú)法執(zhí)行定時(shí)任務(wù),需要的朋友可以參考下2024-01-01詳解Java中finally和return的執(zhí)行順序
try-catch-finally是一種針對(duì)程序運(yùn)行時(shí)出錯(cuò)的響應(yīng)手段,對(duì)于一些可以預(yù)料到的出錯(cuò)類型,在發(fā)生時(shí)對(duì)其進(jìn)行報(bào)告和補(bǔ)救,這篇文章主要介紹了Java中finally和return的執(zhí)行順序,需要的朋友可以參考下2024-01-01Mybatis返回單個(gè)實(shí)體或者返回List的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis返回單個(gè)實(shí)體或者返回List的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07