小編給大家分享一下Java如何實(shí)現(xiàn)回調(diào)函數(shù)與觀(guān)察者模式,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向千余家企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷(xiāo)等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。具體介紹和實(shí)現(xiàn)代碼如下。
觀(guān)察者模式(有時(shí)又被稱(chēng)為發(fā)布(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽(tīng)者(Listener)模式或從屬者模式)是軟件設(shè)計(jì)模式的一種。在此種模式中,一個(gè)目標(biāo)物件管理所有相依于它的觀(guān)察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過(guò)呼叫各觀(guān)察者所提供的方法來(lái)實(shí)現(xiàn)。此種模式通常被用來(lái)實(shí)現(xiàn)事件處理系統(tǒng)。
什么時(shí)候使用觀(guān)察者模式:當(dāng)一個(gè)抽象模型有兩個(gè)方面, 其中一個(gè)方面依賴(lài)于另一方面。將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。
當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象, 而不知道具體有多少對(duì)象有待改變。
當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰(shuí)。換言之, 你不希望這些對(duì)象是緊密耦合的。
其實(shí)觀(guān)察者模式同前面講過(guò)的橋梁、策略有著共同的使用環(huán)境:將變化獨(dú)立封裝起來(lái),以達(dá)到大的重用和解耦。觀(guān)察者與后兩者不同的地方在于,觀(guān)察者模式中的目標(biāo)和觀(guān)察者的變化不是獨(dú)立的,而是有著某些聯(lián)系。
在Java中通過(guò)Observable類(lèi)和Observer接口實(shí)現(xiàn)了觀(guān)察者模式。一個(gè)Observer對(duì)象監(jiān)視著一個(gè)Observable對(duì)象的變化,當(dāng)Observable對(duì)象發(fā)生變化時(shí),Observer得到通知,就可以進(jìn)行相應(yīng)的工作。
package com.demo.test; import java.util.Observable; import java.util.Observer; //觀(guān)察者模式里面目標(biāo)類(lèi)維護(hù)了所有觀(guān)察者的引用,而回調(diào)里面只是維護(hù)了一個(gè)引用 public class ObserverCallbackDemo { // 觀(guān)察者A static class ConcreteObserverA implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("ConcreteObserverA update"); } } // 觀(guān)察者B static class ConcreteObserverB implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("ConcreteObserverB update"); } } // 被觀(guān)察對(duì)象 static class ConcreteObservable extends Observable { public void changeValue() { //protected方法只能在子類(lèi)被調(diào)用 setChanged(); notifyObservers(); } } // 回調(diào)函數(shù)接口 interface ICallback { public void onCall(); } // 回調(diào)類(lèi) static class CallbackDemo { private ICallback callback; public void setListener(ICallback callback) { this.callback = callback; } public void call() { callback.onCall(); } } public static void main(String[] args) { // 觀(guān)察者 ConcreteObserverA observerA = new ConcreteObserverA(); ConcreteObserverB observerB = new ConcreteObserverB(); ConcreteObservable observable = new ConcreteObservable(); observable.addObserver(observerA); observable.addObserver(observerB); System.out.println("countObservers = " + observable.countObservers()); observable.changeValue(); // 回調(diào)函數(shù) CallbackDemo callbackDemo = new CallbackDemo(); callbackDemo.setListener(new ICallback() { @Override public void onCall() { System.out.println("callback onCall"); } } ); callbackDemo.call(); } }
輸出結(jié)果:
countObservers = 2
ConcreteObserverB update
ConcreteObserverA update
callback onCall
以上是“Java如何實(shí)現(xiàn)回調(diào)函數(shù)與觀(guān)察者模式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!