亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android源碼學習之觀察者模式應用及優點介紹

2020-04-11 12:36:38
字體:
來源:轉載
供稿:網友
觀察者模式定義
Define a one-to-many dependency between objects so that when one object changes state, all its dependents aer notified and updated automatically.
定義對象間一種一對多的依賴關系,使得當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。
 
如上圖所示(截取自《Head First Design Patterns》一書),主要包括四個部分
1. Subject被觀察者。是一個接口或者是抽象類,定義被觀察者必須實現的職責,它必須能偶動態地增加、取消觀察者,管理觀察者并通知觀察者。
2. Observer觀察者。觀察者接收到消息后,即進行update更新操作,對接收到的信息進行處理。
3. ConcreteSubject具體的被觀察者。定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。
4. ConcreteObserver具體觀察者。每個觀察者在接收到信息后處理的方式不同,各個觀察者有自己的處理邏輯。
觀察者模式有什么優點呢
觀察者和被觀察者之間是抽象耦合的,不管是增加觀察者還是被觀察者都非常容易擴展。
根據單一職責原則,每個類的職責是單一的,那么怎么把各個單一的職責串聯成真實的復雜的邏輯關系呢,觀察者模式可以起到橋梁作用。
觀察者模式是松耦合的典型。
在Android源碼中,其中一個經典的使用到觀察者模式的就是Android控件的事件監聽模型。
一、下面簡要說明Android交互事件傳輸的設計原理和特征
交互事件,是指當用戶通過按鍵、觸摸、滑動等操作與應用進行交互時觸發的相關事件。通過Android控件樹可知,交互事件是沿著控件樹自頂向下傳播的。其中Android控件樹簡要圖如下所示:
 
當位于控件樹上層的父控件收到交互事件后,會先行判定該事件的目標控件對象,如果該事件正是自己所需要的,則會截獲事件進行處理,否則就嘗試將事件向下分發給對應的子控件,并對推的逐級向下傳播事件,直至該事件被處理或者忽略。

Android在View類中定義了一系列命名為View.On***的事件函數用來接收和處理各類交互事件,如通過View.OnKeyDown函數可以接收到用戶的按鍵操作等。每個派生自View類的子控件都可以通過重載這些事件函數,來處理該控件所需的事件。

例如,如果一個控件需要處理用戶按返回鍵的操作,則可以通過重載View.onKeyDown函數來實現:
復制代碼 代碼如下:

/*
* @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 監聽和處理返回操作
if(keyCode == KeyEvent.KEYCODE_BACK) {
doSomething();
return true;
}
return false;
}

事件函數的返回值是控制事件傳播的重要手段。如果事件函數返回true,則說明該控件已經接收并完成了該事件的處理,無須將該事件進一步傳遞;反之,如果事件函數返回false,則說明該控件對象未能處理該事件(或雖然做過處理,但仍需要進一步處理),需要繼續傳遞以尋找能夠處理它的控件對象。

對于容器控件ViewGroup來說,它的一個職責就是將交互事件傳播到其子控件中。針對不同的事件,ViewGroup可以選擇不同的傳播方式。如,如果是觸摸事件,ViewGroup對象需要判定該事件發生的區域位于哪個子控件上,從而將該事件分配給該子控件進行處理。但通過繼承的方式來進行事件處理并不夠靈活,會導致系統中出現大量的子控件類型,并且各個控件的復用性都較差。因此采用“組合”來代替“繼承”?;诖怂枷耄琕iew類中提供了一系列配套的事件監聽函數供開發者處理對應事件,這就有了使用觀察者模式來完成Android控件的事件監聽模型。開發者可以構造外部觀察者對象與控件對象的事件監聽接口綁定,獲取事件消息。
還是以上面的按鍵事件為例,通過監聽者進行處理的實現如下所示
復制代碼 代碼如下:

final View.OnKeyListener listener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// 處理返回鍵事件
if(keyCode == KeyEvent.KEYCODE_BACK) {
doSomething();
return true;
}
return false;
}
};
。。。
mUISetButton = (Button) findViewById(R.id.setValue);
// 將按鈕與監聽對象綁定
mUISetButton.setOnKeyListener(listener);

通過利用外部對象來處理交互事件,其耦合性低,使每個類控件都具有更好的可復用度,無須為了處理事件而構造新的控件。
二、現在開始看看源代碼是怎么進行組織使用“觀察者模式”的
1. 看View類源代碼中的OnKeyListener接口:
復制代碼 代碼如下:

/**
* Interface definition for a callback to be invoked when a key event is
* dispatched to this view. The callback will be invoked before the key
* event is given to the view.
*/
public interface OnKeyListener {
/**
* Called when a key is dispatched to a view. This allows listeners to
* get a chance to respond before the target view.
*
* @param v The view the key has been dispatched to.
* @param keyCode The code for the physical key that was pressed
* @param event The KeyEvent object containing full information about
* the event.
* @return True if the listener has consumed the event, false otherwise.
*/
boolean onKey(View v, int keyCode, KeyEvent event);
}

2. 再看View類定義了私有成員mOnKeyListener(通過組合的方式):
private OnKeyListener mOnKeyListener;
3. 注冊listener
復制代碼 代碼如下:

/**
* Register a callback to be invoked when a key is pressed in this view.
* @param l the key listener to attach to this view
*/
public void setOnKeyListener(OnKeyListener l) {
mOnKeyListener = l;
}

4. 剩下的就交給開發者自己構造外部觀察者對象與該按鍵的事件接口進行綁定,獲取事件消息。
最后讓我們記住支撐“觀察者模式”的設計原則: Strive for loosely coupled designs between objects that interact.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
麻豆乱码国产一区二区三区| 日韩av在线免费播放| 欧美在线视频a| 丝袜亚洲另类欧美重口| 日本一区二区在线免费播放| 91精品国产自产在线| 国产免费久久av| 成人乱人伦精品视频在线观看| 在线国产精品视频| 亚洲理论电影网| 亚洲国产精品成人va在线观看| 亚洲美女黄色片| www.亚洲天堂| 久久久视频免费观看| 国产亚洲激情视频在线| 欧美日本啪啪无遮挡网站| 色偷偷综合社区| 亚洲一区www| 国产美女久久精品| 久久成年人视频| 国产精品久久久久77777| 91免费看国产| 亚洲精品视频网上网址在线观看| 亚洲性线免费观看视频成熟| 国产精品网站入口| 中文字幕日韩欧美精品在线观看| 奇门遁甲1982国语版免费观看高清| 欧美成在线视频| 欧美午夜视频一区二区| 国产精品高潮呻吟视频| 成人精品aaaa网站| 欧美一级片一区| 成人欧美在线视频| 日韩av综合网| 亚洲 日韩 国产第一| 精品福利在线视频| 日韩理论片久久| 亚洲第一页中文字幕| 欧美性视频网站| 午夜美女久久久久爽久久| 欧美精品久久久久久久久久| 久久精品男人天堂| 搡老女人一区二区三区视频tv| 欧美另类99xxxxx| 免费91麻豆精品国产自产在线观看| 欧美精品第一页在线播放| 亚洲国产天堂久久国产91| 一本大道香蕉久在线播放29| 亚洲女在线观看| 欧美性jizz18性欧美| 欧美视频第一页| 国产网站欧美日韩免费精品在线观看| 人人爽久久涩噜噜噜网站| 欧美日韩高清区| 欧美视频在线观看免费| 国产精品露脸自拍| 美女撒尿一区二区三区| 中文字幕亚洲综合久久筱田步美| 欧美xxxx14xxxxx性爽| 一区二区三区高清国产| 国产成人亚洲综合青青| 国产精品主播视频| 中文字幕日韩欧美| 成人午夜小视频| 日韩欧美国产激情| 亚洲国产日韩欧美在线99| 久久免费高清视频| 自拍亚洲一区欧美另类| 精品国产一区二区三区久久狼黑人| 国产精品三级美女白浆呻吟| 97福利一区二区| 1769国内精品视频在线播放| 91沈先生在线观看| www国产精品视频| 伊人久久久久久久久久| 欧美性69xxxx肥| 精品美女久久久久久免费| 久久亚洲国产精品成人av秋霞| 亚洲第一精品夜夜躁人人爽| 国产精品欧美日韩一区二区| 亚洲国产欧美日韩精品| 亚洲美女av在线| 78m国产成人精品视频| 国产最新精品视频| 亚洲免费视频在线观看| 国产成一区二区| 久久精品人人爽| 一二美女精品欧洲| 久久免费国产精品1| 亚洲自拍偷拍第一页| 中文字幕成人精品久久不卡| 欧美综合国产精品久久丁香| 97av在线视频免费播放| 97国产精品免费视频| 亚洲精品动漫100p| 日韩av黄色在线观看| 国产成人一区二区三区小说| 欧美二区在线播放| 午夜精品在线视频| 国产日韩亚洲欧美| 国产精品成人久久久久| 国外成人在线视频| 91青草视频久久| 中文字幕在线国产精品| 久久成年人免费电影| 成人免费午夜电影| 在线成人一区二区| 国产精品爽爽ⅴa在线观看| 色偷偷偷亚洲综合网另类| 色播久久人人爽人人爽人人片视av| 国产欧美日韩最新| 日韩色av导航| 欧美日韩国产色| 午夜精品一区二区三区在线视| 韩国三级电影久久久久久| 日韩激情视频在线播放| 久久中文字幕视频| 久久影院资源网| 国产日韩精品一区二区| 亚洲国语精品自产拍在线观看| 欧美在线影院在线视频| 亚洲xxxx3d| 亚洲欧美日韩国产精品| 欧美日韩中文在线| 精品伊人久久97| 成人av.网址在线网站| 日韩在线观看免费高清| 久久天天躁狠狠躁夜夜av| 欧美一二三视频| 久久久在线视频| 国产91热爆ts人妖在线| 日韩暖暖在线视频| 精品人伦一区二区三区蜜桃免费| 欧美美最猛性xxxxxx| 色妞色视频一区二区三区四区| 欧美成人国产va精品日本一级| 成人黄色中文字幕| 日韩福利在线播放| 国产精品久久久久免费a∨| yw.139尤物在线精品视频| 夜色77av精品影院| 久久亚洲精品毛片| 色伦专区97中文字幕| 欧美日韩国产在线| 最新国产成人av网站网址麻豆| 91九色在线视频| 日韩免费在线观看视频| 欧美精品九九久久| 91大神在线播放精品| 午夜精品理论片| 国产精品久久久久国产a级| 国产精品一区二区三区在线播放| 国产午夜精品免费一区二区三区| 热久久美女精品天天吊色| 亚洲免费精彩视频| 色无极影院亚洲| 国产福利精品视频| 国产精品女人网站| 国产91精品青草社区| 538国产精品一区二区在线| 国产中文欧美精品| 亚洲毛片一区二区| 欧美野外猛男的大粗鳮| 亚洲一区二区免费|