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

