Java與Android使用監(jiān)聽者模式示例
正文
監(jiān)聽者模式(觀察者模式)能降低對象之間耦合程度。為兩個相互依賴調用的類進行解耦。
便于進行模塊化開發(fā)工作。不同模塊的開發(fā)者可以專注于自身的代碼。
監(jiān)聽者用來監(jiān)聽自已感興趣的事件,當收到自已感興趣的事件時執(zhí)行自定義的操作。
在某些數(shù)據(jù)變化時,其他的類做出一些響應。處理數(shù)據(jù)(或者分發(fā)事件)的類主動投送消息,感興趣的類主動“訂閱”消息。
監(jiān)聽者模式在Android中有大量的運用,相信大家都不會感到陌生。在Android開發(fā)中,Button控件的點擊事件就是監(jiān)聽者模式最常見的例子。
當Button被點擊,執(zhí)行了 OnClickListener.onClick
。 Activity中給這個Button設置了自己實現(xiàn)的OnClickListener
,并復寫了onClick
方法,就能執(zhí)行自定義操作了。
Java代碼實例
下面來用Java來實現(xiàn)監(jiān)聽者模式。
這個例子是給“計算類”持續(xù)地傳入數(shù)據(jù),處理好數(shù)據(jù)后,發(fā)出結果。感興趣的類接收結果。
2個文件:AlgoCalculator.java
;MainUser.java
AlgoCalculator.java
是計算部分,接收數(shù)據(jù)并進行計算。并將結果傳遞出去。MainUser.java
是調用方,將基本數(shù)據(jù)傳入AlgoCalculator并監(jiān)聽結果。
package com.algo; import java.util.LinkedList; import java.util.List; public class AlgoCalculator { private List<short[]> mDataBuffer = new LinkedList<>(); public AlgoCalculator() { } // 定義一個Listener接口;可將一個boolean值傳遞出去 public interface ResultChangeListener { void onChange(boolean found); } private ResultChangeListener resultChangeListener; // 調用方能夠設置并實現(xiàn)這個接口 public void setResultChangedListener(ResultChangeListener resultChangedListener) { this.resultChangeListener = resultChangedListener; } // 傳輸數(shù)據(jù) public void setDataStream(short[] data) { checkData(data);// 處理數(shù)據(jù)方法 } // 處理數(shù)據(jù),并送出結果 private void checkData(short[] data) { if (data.length == 0) { return; } long sum = 0; for (short b : data) { sum += b; } if (sum > 40) { resultChangeListener.onChange(true); // 數(shù)據(jù)處理結果 } else { resultChangeListener.onChange(false); } } }
主程序;調用方傳入數(shù)據(jù),獲取結果
import com.algo.AlgoCalculator; public class MainUser { public static void main(String[] args) { AlgoCalculator algoCalculator = new AlgoCalculator(); // 初始化 // 設置監(jiān)聽器,并在里面增加要執(zhí)行的動作 algoCalculator.setResultChangedListener(new AlgoCalculator.ResultChangeListener() { @Override public void onChange(boolean found) { System.out.println("result: " + found); } }); short[] data1 = {1, 2, 3,}; short[] data2 = {10, 20, 30}; short[] data3 = {6, 7, 8}; short[] data4 = {1, 1, 1}; // 傳入數(shù)據(jù) algoCalculator.setDataStream(data1); // output false algoCalculator.setDataStream(data2); // output true algoCalculator.setDataStream(data3); // output false algoCalculator.setDataStream(data4); // output false } }
在另外的類里,能夠很方便地調用AlgoCalculator
的計算能力并獲取計算結果。 在這里,每傳入一次數(shù)據(jù),就能獲取一個結果。如果每秒鐘傳入一次數(shù)據(jù),每秒鐘就能獲取一個結果。 我們可以把復雜的算法封裝起來,客戶端只需要傳入數(shù)據(jù),即可獲得(監(jiān)聽到)結果。
很多場景中都使用了監(jiān)聽者模式。開發(fā)者也可能在不知不覺中就運用了這個模式。
Android中使用監(jiān)聽器
最常見的例子是給Button設置點擊事件監(jiān)聽器。 類似上個例子,設計一個接口當做監(jiān)聽器。Android中回調時可以利用handler,控制調用的線程。
private Handler mMainHandler; mMainHandler = new Handler(Looper.getMainLooper());// 在主線程中運行 private void notifySthChange(final int state) { mMainHandler.post(new Runnable() { @Override public void run() { ArrayList<SListener> list = new ArrayList<>(mListeners); for (SListener l : list) { l.OnSthChanged(state); } } }); }
在回調中可以直接更新UI。
以上就是Java與Android使用監(jiān)聽者模式示例的詳細內容,更多關于Java Android監(jiān)聽者模式的資料請關注腳本之家其它相關文章!
相關文章
修改idea的這些啟動參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動參數(shù),令你的idea健步如飛~具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01springboot整合shardingsphere和seata實現(xiàn)分布式事務的實踐
本文主要介紹了springboot整合shardingsphere和seata實現(xiàn)分布式事務的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07java自帶的MessageDigest實現(xiàn)文本的md5加密算法
這篇文章主要介紹了java自帶的MessageDigest實現(xiàn)文本的md5加密算法,需要的朋友可以參考下2015-12-12實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口
這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2022-04-04MyBatis實現(xiàn)動態(tài)SQL更新的代碼示例
本文博小編將帶領大家學習如何利用 MyBatis 攔截器機制來優(yōu)雅的實現(xiàn)這個需求,文中通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-07-07SpringBoot + SpringSecurity 短信驗證碼登錄功能實現(xiàn)
這篇文章主要介紹了SpringBoot + SpringSecurity 短信驗證碼登錄功能實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06一文教你如何通過三級緩存解決Spring循環(huán)依賴
這篇文章主要介紹了如何通過三級緩存解決?Spring?循環(huán)依賴,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下2023-07-07