摘要:說(shuō)明生活中,監(jiān)聽(tīng)無(wú)處不在。比如說(shuō),手機(jī)播放音樂(lè)功能,也是一種監(jiān)聽(tīng)你不點(diǎn)擊播放按鈕,手機(jī)就不放歌,當(dāng)你點(diǎn)擊時(shí),手機(jī)就播放音樂(lè)。即觸發(fā)某種行為,便執(zhí)行相應(yīng)的動(dòng)作。
說(shuō)明
生活中,監(jiān)聽(tīng)無(wú)處不在。比如說(shuō),手機(jī)播放音樂(lè)功能,也是一種監(jiān)聽(tīng):你不點(diǎn)擊播放按鈕,手機(jī)就不放歌,當(dāng)你點(diǎn)擊時(shí),手機(jī)就播放音樂(lè)。即觸發(fā)某種行為,便執(zhí)行相應(yīng)的動(dòng)作。
組成Java監(jiān)聽(tīng)模式右三個(gè)部分組成:事件源、事件對(duì)象、事件監(jiān)聽(tīng)器
當(dāng)事件源觸發(fā)某種行為,會(huì)自動(dòng)執(zhí)行事件監(jiān)聽(tīng)器里面相應(yīng)的方法
事件監(jiān)聽(tīng)器方法參數(shù)是事件對(duì)象,事件對(duì)象包含事件源的引用,在方法中可以獲取事件源的引用
PS:好吧,說(shuō)的有點(diǎn)暈,因?yàn)槲乙彩莿倢W(xué)的啦,看的暈的同學(xué)直接看代碼就好了。
實(shí)現(xiàn)事件源:Student擁有read()方法,
package com.petro.listener; /** * @ClassName: Student * @description: 監(jiān)聽(tīng)模式的事件源 * @author Petro Chen * @date: 2017年9月12日下午11:32:03 */ public class Student { // read方法事件監(jiān)聽(tīng)器引用 private Listener listener; /** * @description: 注冊(cè)read方法的事件監(jiān)聽(tīng)器 * @param listener 事件監(jiān)聽(tīng)器引用 * @return void * @throws */ public void setReadListener(Listener listener) { this.listener = listener; } /** * @description: 學(xué)生的read方法 * @return void * @throws */ public void read() { if (listener != null) { Event event = new Event(); event.setStudent(this); // 學(xué)生正在讀書(shū)... listener.isReading(event); } } }
事件監(jiān)聽(tīng)器:用來(lái)監(jiān)聽(tīng)Student.read()方法
package com.petro.listener; /** * @ClassName: Listener * @description: 事件監(jiān)聽(tīng)器 * @author Petro Chen * @date: 2017年9月12日下午11:33:56 */ public interface Listener { /** * @description: 學(xué)生讀書(shū)觸發(fā)的事件 * @param event 事件對(duì)象引用,通過(guò)這個(gè)引用,獲取事件源的引用,然后就可以對(duì)事件源進(jìn)行操作 * @return void * @throws */ public void isReading(Event event); }
事件對(duì)象:持有事件源的引用
package com.petro.listener; /** * @ClassName: Event * @description: 事件對(duì)象 * @author Petro Chen * @date: 2017年9月12日下午11:41:28 */ public class Event { // 放置事件源的引用 private Student student; public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } }
到此為止,我們的監(jiān)聽(tīng)模式寫(xiě)完了,接下來(lái)當(dāng)然是測(cè)試?yán)?/p>
測(cè)試部分:監(jiān)聽(tīng)接口實(shí)現(xiàn)
package com.petro.test; import com.petro.listener.Event; import com.petro.listener.Listener; /** * @ClassName: ReadListener * @description: 監(jiān)聽(tīng)器實(shí)現(xiàn),讀書(shū)(read方法)監(jiān)聽(tīng)器 * @author Petro Chen * @date: 2017年9月13日上午12:03:35 */ public class ReadListener implements Listener { @Override public void isReading(Event event) { /** * 使用 event.getStudent()方法獲取事件源的引用,然后執(zhí)行相關(guān)操作 */ System.out.println("正在讀書(shū)..."); } }
測(cè)試部分:程序入口
package com.petro.test; import com.petro.listener.Student; /** * @ClassName: Test * @description: 監(jiān)聽(tīng)器模式測(cè)試 * @author Petro Chen * @date: 2017年9月13日上午12:07:04 */ public class Test { public static void main(String[] args) { ReadListener readListener = new ReadListener(); Student student = new Student(); student.setReadListener(readListener); // 當(dāng)執(zhí)行這個(gè)方法時(shí),會(huì)自動(dòng)調(diào)用ReadListener.isReading()方法 student.read(); } }
監(jiān)聽(tīng)模式demo地址,有需要的可以去clone
https://github.com/MiniPeter/...結(jié)語(yǔ)
本篇博文到此差不多就結(jié)束啦,對(duì)本篇博文有建議或者疑惑的可以留言評(píng)論哦。歡迎指正錯(cuò)誤>_<
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70923.html
摘要:線程安全的實(shí)現(xiàn)前面章節(jié)介紹了在現(xiàn)代環(huán)境下的實(shí)現(xiàn)觀察者模式,雖然簡(jiǎn)單但很完整,但這一實(shí)現(xiàn)忽略了一個(gè)關(guān)鍵性問(wèn)題線程安全。截止目前實(shí)現(xiàn)了線程安全,在接下來(lái)的章節(jié)中將介紹提取主題的邏輯并將其類(lèi)封裝為可重復(fù)代碼單元的方式優(yōu)缺點(diǎn)。 【編者按】本文作者是 BAE 系統(tǒng)公司的軟件工程師 Justin Albano。在本篇文章中,作者通過(guò)在 Java8 環(huán)境下實(shí)現(xiàn)觀察者模式的實(shí)例,進(jìn)一步介紹了什么是觀察...
摘要:本文主要講述消息服務(wù)在中的使用。所以需要一個(gè)監(jiān)聽(tīng)容器工廠的概念,即接口,它會(huì)引用上面創(chuàng)建好的與的連接工廠,由它來(lái)負(fù)責(zé)接收消息以及將消息分發(fā)給指定的監(jiān)聽(tīng)器。為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog> 本文所有服務(wù)均采用doc...
摘要:在前面的文章中介紹過(guò)觀察者模式及并發(fā)編程的基礎(chǔ)知識(shí),為了讓大家更好的了解觀察者模式故而特意寫(xiě)了這篇番外概述在多線程下我們需要知道當(dāng)前執(zhí)行線程的狀態(tài)是什么比如運(yùn)行,關(guān)閉,異常等狀態(tài)的通知,而且不僅僅是更新當(dāng)前頁(yè)面。 在前面的文章中介紹過(guò) 觀察者模式 及 并發(fā)編程的基礎(chǔ)知識(shí),為了讓大家更好的了解觀察者模式故而特意寫(xiě)了這篇番外.. 概述 在Java多線程下,我們需要知道當(dāng)前執(zhí)行線程的狀態(tài)是...
摘要:阻塞請(qǐng)求結(jié)果返回之前,當(dāng)前線程被掛起。也就是說(shuō)在異步中,不會(huì)對(duì)用戶(hù)線程產(chǎn)生任何阻塞。當(dāng)前線程在拿到此次請(qǐng)求結(jié)果的過(guò)程中,可以做其它事情。事實(shí)上,可以只用一個(gè)線程處理所有的通道。 準(zhǔn)備知識(shí) 同步、異步、阻塞、非阻塞 同步和異步說(shuō)的是服務(wù)端消息的通知機(jī)制,阻塞和非阻塞說(shuō)的是客戶(hù)端線程的狀態(tài)。已客戶(hù)端一次網(wǎng)絡(luò)請(qǐng)求為例做簡(jiǎn)單說(shuō)明: 同步同步是指一次請(qǐng)求沒(méi)有得到結(jié)果之前就不返回。 異步請(qǐng)求不會(huì)...
摘要:在設(shè)定時(shí)間內(nèi)接收到相應(yīng)操作的請(qǐng)求則返回可以處理請(qǐng)求的數(shù)量,否則在超時(shí)后返回,程序繼續(xù)執(zhí)行。使用接收請(qǐng)求并處理接收到請(qǐng)求后調(diào)用返回的集合。保存了處理當(dāng)前請(qǐng)求的和,并提供了不同的操作類(lèi)型。默認(rèn)值為且其值必須小于的值。 Java中的Socket可以分為普通Socket和NioSocket兩種。 普通Socket的用法 Java中的網(wǎng)絡(luò)通信是通過(guò)Socket實(shí)現(xiàn)的,Socket分為Server...
閱讀 1449·2021-11-22 13:54
閱讀 4363·2021-09-22 15:56
閱讀 1822·2021-09-03 10:30
閱讀 1321·2021-09-03 10:30
閱讀 2089·2019-08-30 15:55
閱讀 1857·2019-08-30 14:13
閱讀 2063·2019-08-29 15:19
閱讀 2362·2019-08-28 18:13