1. 程式人生 > >監聽器實現、回撥函式。

監聽器實現、回撥函式。

我們用好簡單的例子和程式碼來說明監聽器的實現也及回撥怎麼寫。

背景:女孩叫男朋友出去玩時,男朋友在打遊戲。

  1. 女孩有了一個男朋友。
  2. 女孩說:你打完了叫了,我們再一起出去玩。
  3. 男朋友同意了,並記下了。
  4. 遊戲打完了,男朋友喊了女朋友,女孩聽到後就叫男朋友出去玩
  5. 男朋友說再打一局。
為了女孩不要傻等男朋友打完遊戲,女孩設定了一個監聽器,監聽男朋友遊戲進度。監聽如果監聽到遊戲結束,就回調已經女孩事先已經想好的事件。而女孩就可以在男朋友打遊戲時做自己想做的事(比如化妝等)。這樣就可以多執行緒跑,而不因為男孩的遊戲阻塞讓女朋友執行緒一直等待。


Main類:

public class Main {
	
	public static void main(String[] args){
		//女孩有了一個男朋友,好恩愛。(具有男朋友屬性)
		GirlFriend girlFriend=new GirlFriend();
	
		//女孩說:你打完了叫了,我們再一起出去玩。(具有監聽器並初始化監聽器)
		girlFriend.initListener();
	
		//男朋友同意了,並記下了。(設定男朋友的遊戲監聽器)
		girlFriend.setBoyFriendGameListener();
		
		//遊戲打完了,男朋友喊了女朋友,女孩聽到後就叫男朋友出去玩(男朋友回撥監聽程式碼)
		girlFriend.mBoyFriend.GameDefeated();
	}
}

女朋友類:
public class GirlFriend {
	
	BoyFriend mBoyFriend=new BoyFriend();
	GameListener mGameListener;
	public void initListener(){
		mGameListener=new GameListener() {
			@Override
			public void GameOver() {
				System.out.println(getClass().getName()+":走,一起出去玩");
			}
		};
	}
	public void setBoyFriendGameListener(){
		mBoyFriend.setGameListener(mGameListener);
	}
	
}
男朋友類:
public class BoyFriend {
	GameListener gameListener;
	
	//設定監聽介面
	public void setGameListener(GameListener gameListener){
		this.gameListener = gameListener;
	}
	//遊戲結束
	public void GameDefeated(){
		System.out.println("遊戲結束");
		if(gameListener!=null){
			gameListener.GameOver();
		}
		System.out.println(getClass().getName()+": 不行,我要再來一局");
	}
}
監聽介面:
public interface GameListener {
	public void GameOver();
}


執行結果:

遊戲結束
GirlFriend$1:走,一起出去玩
BoyFriend: 不行,我要再來一局

是不是通俗易懂,那我們現在再看百科的概念:

回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。

相關推薦

監聽器實現函式

我們用好簡單的例子和程式碼來說明監聽器的實現也及回撥怎麼寫。 背景:女孩叫男朋友出去玩時,男朋友在打遊戲。 女孩有了一個男朋友。女孩說:你打完了叫了,我們再一起出去玩。男朋友同意了,並記下了。遊戲

一文搞懂:詞法作用域動態作用域函式閉包

不管什麼語言,我們總要學習作用域(或生命週期)的概念,比如常見的稱呼:全域性變數、包變數、模組變數、本地變數、區域性變數等等。不管如何稱呼這些作用域的範圍,實現它們的目的都一樣: (1)為了避免名稱衝突; (2)為了限定變數的生命週期(本文以變數名說事,其它的名稱在規則上是一樣的)

JavaScript踩坑筆記09---閉包函式

閉包: 簡單點說,閉包就是一個倉庫,它的作用就是將我們要用的區域性變數暫時儲存起來。 舉例說明。 // 定義一個函式fn,其中有一個區域性變數num function fn() { var num = 10; } 以上例子中,我們在函式fn中定義了一個變數num,所以變數的n

jqGrid----下拉列表框下拉聯動,dataEvents函式

1.給單元格添onchange事件 例項: $('#gridYosan').setColProp('yosanka', {editoptions: { dataEvents:[{ type: 'change', fn: fun

JavaScript基礎總結深入(資料型別資料_變數_記憶體物件函式函式this)

資料型別 1、分類 JavaScript 資料型別分為兩大類,分別為:基本型別,又稱為值型別;物件型別,又稱為引用型別。 基本(值)型別 String:任意字元 Number:任意的數字 boolean: true/false undefined: undefi

Python基礎筆記_Day08_Python偏函式函式遞迴函式

Day08_Python偏函式、回撥函式、遞迴函式 08.01_Python語言基礎(偏函式)(熟練) 08.02_Python語言基礎(回撥函式)(掌握) 08.03_Python語言基礎變數(Python變數)(重點重點重點掌握) 08.04_Python語言基礎(遞迴函式)(重點)

移動端彈出層,帶確定取消其他函式

$(document).ready(function(){     $.MsgBox = {         /*Alert沒有回撥         *title:標題 &n

extjs中元件監聽器裡面的函式說明

最近在看專案原始碼的時候發現瞭如下程式碼,其中_searchSupplierStore是JsonStore物件 _searchSupplierStore.on('beforeload',function(thiz,options){  thiz.baseParams["cu

函式指標函式與 GObject 閉包 GObject 子類物件的析構過程 GObject 的訊號機制——概覽

手冊所述,GObject 訊號(Gignal)主要用於特定事件與響應者之間的連線,它與作業系統級中的訊號沒有什麼關係。例如,當我向一個檔案中寫入資料的時候,我期望能夠有一個或多個函式響應這個“向檔案寫入資料”的事件,這一期望便可基於 GObject 訊號予以實現。 為了更好的理解 GObje

JavaScript:理解事件事件處理函式鉤子函式函式

js獲取dom資料的兩種方式: 1  js派函式監聽事件 =>監聽函式就是所謂的鉤子函式=>函式鉤取事件:函式主動找事件=>鉤子函式 2  js預留函式給dom事件,dom事件呼叫js預留的函式 =>事件派發給函式:事件呼叫函式=>回

【不在混淆的C】指標函式函式指標函式

一、指標函式 函式的返回值是指標型別。 int* fun(int a,int b); 指標函式使用: 返回字串 這裡要注意,"1234567890abc"是字串常量,*p指向的字串地址,返回的是這個地址,因為字串常量不會因為函式消亡而釋放,所有主函式依然可以訪問到地址的內容。 #include <

26【支付模組開發】——支付寶函式實現和查詢使用者訂單狀態介面編寫

####1、支付寶回撥函式實現 我們在除錯支付寶沙箱環境的時候,支護寶會有一個回撥函式,也就是在支付成功之後,可以呼叫我們支付之後需要執行的相關方法,從而達到資料庫的資料和我們的操作相統一。 首先我們先在本地將回調函式編寫好~ 在OrderController類中新建我們的支付寶回撥函式

Qt 學習之路 2(19):事件的接受與忽略(當重寫事件回撥函式時,時刻注意是否需要通過呼叫父類的同名函式來確保原有實現仍能進行!有好幾個例子為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類中的這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就

關於ssm,前臺html頁面jquery的success函式實現跳轉重新整理問題

$(function(){ $.ajax({ type:“post”, url:"…/…/b/k.action", dataType: “json”, success:function(data){ $(data).each(function(k,v){ $("tbody").a

非同步+機制執行緒queue執行緒Event協程單執行緒實現遇到IO切換

# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor # import requests # import os # import time # import random # # def get(

day032程序池(重點)程序池的同步非同步方法,函式;管道資料共享

本節內容: 1、管道(瞭解) 2、資料共享(瞭解) 3、程序池(重點) 4、程序的同步方法 5、程序池的非同步方法 6、回撥函式 7、檔案物件的獲取 一、管道(瞭解) 程序間通訊(IPC)

unity | 按鈕onClick沒有function解決辦法button繫結函式步驟

0. 首先新建C#指令碼,定義回撥函式,例如:resetPos using System.Collections; using System.Collections.Generic; using State; using UnityEngine; using UnityEngine.UI; p

程序間的資料共享程序池的函式和執行緒初識守護執行緒

一、程序的資料共享 程序間資料是獨立的,可以藉助於佇列或管道實現通訊,二者都是基於訊息傳遞的 雖然程序間資料獨立,但可以通過Manager實現資料共享。 把所有實現了資料共享的比較便捷的類都重新又封裝了一遍,並且在原有的multiprocessing基礎上增加了新

Java JNA (二)—— dll函式實現

java呼叫dll檔案需要使用回撥函式作為公開函式的引數時,用以下方法實現: 首先,看c++中定義的dll公開函式: typedef void (*ccback)(char *name ,int length); int dllFunction(char *ip, i

JS實現函式

場景:             現在我要建立一個地圖,建立成功之後,執行回撥函式,整個過程有點類似於前端向後臺傳送請求,成功之後拿到結果執行回撥函式。 程式碼: <script> function createMap (){ var opti