【威哥說】磨礪營也要上頭條,寶寶的故事讓經紀人火了.作為國內當值的Android開發領域的網紅,威哥正式提出要針對寶寶的時間做出回應:今天就由波波老師帶領大家一起學習一下"監聽".事件監聽,又叫接口回調,還稱為觀察者設計模式。
【思考】大家都說有了目標大家才有了奮斗的方向,但是在現實生活中,又有多少人知道自己到底想要什么東西?并為之奮斗呢?你真正實施了嗎?
【正文】那我們先看一下什么叫事件,怎么去監聽。
事件:就是某一時刻發生的一件事,比如某主播用志玲姐姐事件,寶強離婚事件,定個小目標,掙一億事件等等等等,這就叫事件。
那么為什么會有事件監聽這個說法呢,這類說法是為了解決程序中有一些邏輯,一旦狀態發生改變時,我們需要相應的去執行一些對應的邏輯,此時我們就需要對對應事件進行監聽。如程序中的按鈕,點擊后需要執行什么邏輯;再比如我從網絡加載數據,加載完成之后進行顯示......等等,諸如此類的,都需要加上監聽。那么具體的如何去監聽呢?首先咱們分析一下我們就拿寶強離婚事件來簡述在一個事件中具備哪些成員:
1、事件源:
針對寶強離婚事件,不用說事件源肯定是寶強
2、事件
感覺前面已經說了,這事件肯定是寶強離婚事件
3、監聽者(器)
監聽者,或者說監聽器,這里可以是各大新聞媒體的記者,如網易新聞的,騰訊新聞的,鳳凰新聞的等等。
4、事件處理
針對收到的一線消息,各大平臺的記者作出第一時間的處理。
分析了如上這個實際情況分析,我們引入到代碼中來進行驗證一下。
首先咱們一般有個監聽者的父類接口,假設此處我們監聽寶強的最新資產變動,那么定義為BaoQiangListener,并在其中有一個更新了通知所有新聞平臺記者的方法:
//監聽者的父類接口
public interface BaoQiangListener {
//通知所有的記者
void notifyAllReporter(float price);
}
接下來是具體的監聽者,如SinaReporter,比如說新浪的記者一發現寶強房產變化,立馬去通知新聞部趕緊撰寫標題,上新浪微博發帖;
public class SinaReporter implements BaoQiangListener{
@Override
public void notifyAllReporter(float price) {
System.out.println("通知新浪微博撰寫標題,吸取關注");
}
}
同樣,騰訊的記者也不甘示弱,聽到消息后,直接發布到騰訊新聞網上吸睛。
public class TencentReporter implements BaoQiangListener{
@Override
public void notifyAllReporter(float price) {
System.out.println("通知騰訊新聞網發布內容吸睛");
}
}
咱先注冊兩個監聽者,其他的有興趣大家可以下去試試,哎,有人說你現在就是一個單個的監聽者,哪有被監聽者,怎么發生關系也還沒寫,各是個的,怎么去監聽,談什么監聽。嫑急,嫑急嘛,現在是不是就需要一個被監聽者了,那么這里的被監聽者是誰呢?毫無疑問是寶強。
public class BaoQiang{
private float personal_money; //寶強的個人資產
private List list;//存儲需要被通知的監聽者
//有監聽者要加入進來予以記錄
public void addListener(BaoQiangListener listener){
list.add(listener);
}
//有監聽者要退訂,就予以刪除
public void removeListener(BaoQiangListener listener){
list.remove(listener);
}
//更改寶強的資產
public void setPersonal_money(float personal_money){
this.personal_money = personal_money;
notifyReporter();
}
//更改后通知所有監聽者
private void notifyReporter() {
for (int i = 0; i < list.size(); i++) {
list.get(i).notifyAllReporter(personal_money);
}
}
}
對寶強的定義也就是上面這些了,要記錄下來哪些需要通知的新聞記者,一旦資產發生變化,就直接對所有需要被通知的對象進行通知。
那么我們進行測試如下:
public static void main(String[] args) {
BaoQiangListener sina = new SinaReporter();
TencentReporter tent = new TencentReporter();
BaoQiang baoqiang = new BaoQiang();
baoqiang.addListener(sina);
baoqiang.addListener(tent);
baoqiang.setPersonal_money(100000f);
System.out.println("--------------------");
baoqiang.setPersonal_money(200000000000f);
}
運行結果如下:
通知新浪微博撰寫標題,吸取關注
通知騰訊新聞網發布內容吸睛
--------------------
通知新浪微博撰寫標題,吸取關注
通知騰訊新聞網發布內容吸睛
如此,我們可以看到只要寶強資產一發生變化,關注的兩家的記者馬上就能進行相應處理,這就叫響應事件了。
那么咱們仔細分析一下這個中間的步驟:
1、定義一個觀察者的父類接口,定義更新方法,方法中可以帶上更新后的數據,便于使用;
2、定義一個具體的觀察者,重寫方法后可直接針對更新的參數進行處理;
3、定義一個被觀察者,被觀察者中記錄下所有的觀察者,然后在需要監聽的地方,對狀態改變后直接對所有的觀察者進行通知。