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