日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android开发模式,Android开发中无处不在的设计模式

發布時間:2025/4/16 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android开发模式,Android开发中无处不在的设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android開發中無處不在的設計模式――單例模式

Android開發中無處不在的設計模式――Builder模式

前面介紹了單例模式和Builder模式,有興趣的見上面兩個鏈接,這篇文章側重介紹1下視察者模式。先看下這個模式的定義。

定義對象間的1種1對多的依賴關系,當1個對象的狀態發送改變時,所有依賴于它的對象都能得到通知并被自動更新

還是那句話,定義常常是抽象的,要深入的理解定義,你需要自己動手實踐1下。

先來說幾個情形。

情形1

有1種短佩服務,比如天氣預報服務,1旦你定閱該服務,你只需按月付費,付完費后,每天1旦有天氣信息更新,它就會及時向你發送最新的天氣信息。

情形2

雜志的定閱,你只需向郵局定閱雜志,繳納1定的費用,當有新的雜志時,郵局會自動將雜志送至你預留的地址。

視察上面兩個情形,有1個共同點,就是我們無需每時每刻關注我們感興趣的東西,我們只需做的就是定閱感興趣的事物,比如天氣預報服務,雜志等,1旦我們定閱的事物產生變化,比如有新的天氣預報信息,新的雜志等,被定閱的事物就會即時通知到定閱者,即我們。而這些被定閱的事物可以具有多個定閱者,也就是1對多的關系。固然,嚴格意義上講,這個1對多可以包括1對1,由于1對1是1對多的特例,沒有特殊說明,本文的1對多包括了1對1。

現在你反過頭來看看視察者模式的定義,你是否是豁然開朗了。

然后我們看1下視察者模式的幾個重要組成。

視察者,我們稱它為Observer,有時候我們也稱它為定閱者,即Subscriber

被視察者,我們稱它為Observable,便可以被視察的東西,有時候還會稱之為主題,即Subject

至于視察者模式的具體實現,這里帶帶大家實現1下場景1,其實java中提供了Observable類和Observer接口供我們快速的實現該模式,但是為了加深印象,我們不使用這兩個類。

場景1中我們感興趣的事情是天氣預報,因而,我們應當定義1個Weather實體類。

public class Weather { private String description; public Weather(String description) { this.description = description;

} public String getDescription() { return description;

} public void setDescription(String description) { this.description = description;

}

@Override public String toString() { return "Weather{" + "description=" + description + + };

}

}

然后定義我們的被視察者,我們想要這個被視察者能夠通用,將其定義成泛型。內部應當暴露register和unregister方法供視察者定閱和取消定閱,至于視察者的保存,直接用ArrayList便可,另外,當有主題內容發送改變時,會即時通知視察者做出反應,因此應當暴露1個notifyObservers方法,以上方法的具體實現見以下代碼。

public class Observable{

ListmObservers = new ArrayList(); public void register(Observerobserver) { if (observer == null) { throw new NullPointerException("observer == null");

}

synchronized (this) { if (!mObservers.contains(observer))

mObservers.add(observer);

}

} public synchronized void unregister(Observerobserver) {

mObservers.remove(observer);

} public void notifyObservers(T data) { for (Observerobserver : mObservers) {

observer.onUpdate(this, data);

}

}

}

而我們的視察者,只需要實現1個視察者的接口Observer,該接口也是泛型的。其定義以下。

public interface Observer{ void onUpdate(Observableobservable,T data);

}

1旦定閱的主題發送變換就會回調該接口。

我們來使用1下,我們定義了1個天氣變換的主題,也就是被視察者,還有兩個視察者視察天氣變換,1旦變換了,就打印出天氣信息,注意1定要調用被視察者的register進行注冊,否則會收不到變換信息。而1旦不敢興趣了,直接調用unregister方法進行取消注冊便可

public class Main { public static void main(String [] args){

Observableobservable=new Observable();

Observerobserver1=new Observer() {

@Override public void onUpdate(Observableobservable, Weather data) {

System.out.println("視察者1:"+data.toString());

}

};

Observerobserver2=new Observer() {

@Override public void onUpdate(Observableobservable, Weather data) {

System.out.println("視察者2:"+data.toString());

}

};

observable.register(observer1);

observable.register(observer2);

Weather weather=new Weather("晴轉多云");

observable.notifyObservers(weather);

Weather weather1=new Weather("多云轉陰");

observable.notifyObservers(weather1);

observable.unregister(observer1);

Weather weather2=new Weather("臺風");

observable.notifyObservers(weather2);

}

}

最后的輸出結果也是沒有甚么問題的,以下

視察者1:Weather{description=’晴轉多云’}

視察者2:Weather{description=’晴轉多云’}

視察者1:Weather{description=’多云轉陰’}

視察者2:Weather{description=’多云轉陰’}

視察者2:Weather{description=’臺風’}

接下來我們看看視察者模式在android中的利用。我們從最簡單的開始。還記得我們為1個Button設置點擊事件的代碼嗎。

Button btn=new Button(this);

btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {

Log.e("TAG","click");

}

});

其實嚴格意義上講,這個最多算是回調,但是我們可以將其看成是1對1的視察者模式,即只有1個視察者。

其實只要是set系列的設置監聽器的方法最多都只能算回調,但是有1些監聽器式add進去的,這類就是視察者模式了,比如RecyclerView中的addOnScrollListener方法

private ListmScrollListeners; public void addOnScrollListener(OnScrollListener listener) { if (mScrollListeners == null) {

mScrollListeners = new ArrayList();

}

mScrollListeners.add(listener);

} public void removeOnScrollListener(OnScrollListener listener) { if (mScrollListeners != null) {

mScrollListeners.remove(listener);

}

} public void clearOnScrollListeners() { if (mScrollListeners != null) {

mScrollListeners.clear();

}

}

然后有轉動事件時便會觸發視察者進行方法回調

public abstract static class OnScrollListener { public void onScrollStateChanged(RecyclerView recyclerView, int newState){} public void onScrolled(RecyclerView recyclerView, int dx, int dy){}

} void dispatchOnScrolled(int hresult, int vresult) { //... if (mScrollListeners != null) { for (int i = mScrollListeners.size() - 1; i >= 0; i--) {

mScrollListeners.get(i).onScrolled(this, hresult, vresult);

}

}

} void dispatchOnScrollStateChanged(int state) { //... if (mScrollListeners != null) { for (int i = mScrollListeners.size() - 1; i >= 0; i--) {

mScrollListeners.get(i).onScrollStateChanged(this, state);

}

}

}

類似的方法很多很多,都是add監聽器系列的方法,這里也不再舉例。

還有1個地方就是Android的廣播機制,其本質也是視察者模式,這里為了簡單方便,直接拿本地廣播的代碼說明,即LocalBroadcastManager。

我們平時使用本地廣播主要就是下面4個方法

LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(BroadcastReceiver receiver, IntentFilter filter); localBroadcastManager.unregisterReceiver(BroadcastReceiver receiver); localBroadcastManager.sendBroadcast(Intent intent)

調用registerReceiver方法注冊廣播,調用unregisterReceiver方法取消注冊,以后直接使用sendBroadcast發送廣播,發送廣播以后,注冊的廣播會收到對應的廣播信息,這就是典型的視察者模式。具體的源代碼這里也不貼。

android系統中的視察者模式還有很多很多,有興趣的自己去發掘,接下來我們看1下1些開源框架中的視察者模式。1說到開源框架,你首先想到的應當是EventBus。沒錯,EventBus也是基于視察者模式的。

視察者模式的3個典型方法它都具有,即注冊,取消注冊,發送事件

EventBus.getDefault().register(Object subscriber); EventBus.getDefault().unregister(Object subscriber); EventBus.getDefault().post(Object event);

內部源碼也不展開了。接下來看1下重量級的庫,它就是RxJava,由于學習曲線的峻峭,這個庫讓很多人望而止步。

創建1個被視察者

ObservablemyObservable = Observable.create(

new Observable.OnSubscribe() { @Override public void call(Subscriber sub) { sub.onNext("Hello, world!"); sub.onCompleted(); }

}

);

創建1個視察者,也就是定閱者

SubscribermySubscriber = new Subscriber() { @Override public void onNext(String s) { System.out.println(s); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { }

};

視察者進行事件的定閱

myObservable.subscribe(mySubscriber);

具體源碼也不展開,不過RxJava這個開源庫的源碼個人還是建議很值得去看1看的。

總之,在Android中視察者模式還是被用得很頻繁的。

總結

以上是生活随笔為你收集整理的android开发模式,Android开发中无处不在的设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久免费精品 | 国产精品久久久久毛片软件 | 91国产视频在线播放 | 99re在线精品视频 | 少妇裸体淫交视频免费看高清 | 天天色天天 | 欧美一级录像 | 国产精品国产三级国产普通话对白 | 伊人春色视频 | 午夜色av | 亚洲伦理影院 | 国产欧美日韩在线 | 高中男男gay互囗交观看 | 国产乱子伦视频一区二区三区 | 38激情| 澳门av在线 | 国产秋霞 | 亚洲区小说区图片区 | 美女视频黄色在线观看 | 能看的黄色网址 | 精品国产18久久久久久二百 | 欧美看片 | 91在线精品秘密一区二区 | 疯狂做受xxxx高潮人妖 | 欧美黄色录像视频 | 无码日韩人妻精品久久蜜桃 | 久久99免费视频 | 一本大道久久 | 日韩av一卡 | 色婷婷狠狠爱 | 一级片在线观看视频 | 香蕉毛片 | 欧美黄色特级视频 | 男女在线观看视频 | 久草成人在线 | 三上悠亚激情av一区二区三区 | 在线观看 一区 | 特级淫片aaaaaaa级附近的 | 性视频在线播放 | 国产一级自拍 | 国产区久久 | 国产精品国产精品国产专区蜜臀ah | 男人的天堂色 | 无码人妻精品一区二区三区66 | 别揉我奶头一区二区三区 | 亚洲美女性生活 | 亚洲国产精品久久久久久久 | 玖玖精品国产 | 91亚洲欧美激情 | 成人亚洲黄色 | 日本大尺度做爰呻吟舌吻 | 无码人妻少妇伦在线电影 | 青青久在线视频 | 蜜桃91麻豆精品一二三区 | 影音先锋欧美资源 | 欧美精品一二区 | 色哟哟黄色 | 免费看一级 | 国产欧美在线观看不卡 | 日操干 | 日本视频免费在线 | 免费看成人片 | 亚洲大胆人体 | 日韩免费一区二区三区 | 国产成人一区二区三区电影 | 一区二区三区四区五区在线视频 | 国产福利在线播放 | 午夜精品久久久内射近拍高清 | 成人精品黄段子 | 欧美大片视频在线观看 | 亚洲91网 | 丰满少妇一区二区三区专区 | 欧美在线专区 | 国产免费成人av | 亚洲一区精品在线 | 男人天堂中文字幕 | 欧美日韩网址 | 四川丰满少妇被弄到高潮 | 狠狠干干干 | 日本久久99| 韩国一级淫片免费看 | 国产视频在 | 住在隔壁的她动漫免费观看全集下载 | 国产高清亚洲 | 五月天视频网站 | 久久久夜色 | 小毛片在线观看 | 午夜国产福利视频 | 国产农村乱对白刺激视频 | 成人h网站| 好妞色妞国产在线视频 | 国产黄频 | 国产美女无遮挡永久免费 | 奇米一区二区 | 免费视频一区二区 | 飘花影院伦理片 | 在线观看精品国产 | 日本一级片在线观看 | 91综合在线|