今天在看java編程思想的時候看到回調函數這個問題,在這里總結一下自己對回調函數的理解加深一下印象。
回調函數,簡單的從實際運用來給個定義啊。就是客戶端調用服務起執行一個函數,當服務器端執行完成之后反過來調用客戶端的函數。就是這樣一個簡單的過程。相信有過前端編程經驗的人都知道這個概念,比如ajax進行異步調用。
今天我們舉一個例子來說明回調函數的使用方法,我們現在生活很方便,充值話費可以直接在支付寶或者是微信上面進行,我們可以簡單的使用回調函數的方式來模擬這個過程是如何實現的。我們簡答介紹一下這個過程,首先客戶端微信調用服務器端的接口進行充值操作,但是服務器端需要完成的內容就比較多了,比如:銀行完成轉賬,運營商進行充值等,所以這個過程就是一個異步的過程。我們完成微信充值之后會收到充值成功的界面,但是實際上充值並未成功。這里我們假設10086給我們發送的信息也是微信充值后台做的,代表着充值完成(實際上這是運營商做的)。
思路如下: 首先客戶端需要調用服務器端進行充值的操作,這個過程中客戶端會提供充值的金額和充值的賬戶。
服務器端接受到請求之后會進行充值,在這個過程完成之后 服務器端需要知道應該告訴誰充值過程完成了,也就是需要給誰回調信息。但是服務不光提供給指定的用戶,所以這里需要對客戶端進行抽象。
服務器端完成這個操作之后回調客戶端的信息即可。
代碼如下:代碼中有詳細的注釋 ,如有不當請大家指正。謝謝。
統一的接口:
/** * 完成充值后回調函數需要執行的內容 * @author libo */ public interface ServerInterface { public void sendMessage(int amount,String account); }
客戶端:
/** */ public class WechatClient implements ServerInterface{ private int amount; private String account; @Override public void sendMessage(int amount, String account) { // TODO Auto-generated method stub System.out.println("客戶:"+account+"完成賬戶充值,金額:"+amount); } //調用服務器端進行充值 public void forRecharge(){ System.out.println("開始調用服務器端進行充值"); new WechatServer().recharge(amount, account, this); } public WechatClient(int amount,String account) { this.amount = amount; this.account = account; } }
服務器端:
/** * 服務器端需要完成客戶端的調用 * 並且進行回調 注意這里回調就是指的短信提示 * 並且服務器端需要提供制定的回調方法,這就意味着所有的客戶端都需要實現定義的接口 * @author libo */ public class WechatServer { @SuppressWarnings("static-access") public void recharge(int amount,String account,ServerInterface wechatClient){ System.out.println("服務器端開始進行充值操作"); try { Thread.currentThread().sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("充值操作完成"); //充值操作完成之后需要調用客戶端的回調函數通知客戶端 wechatClient.sendMessage(amount, account); } }
主函數:
public class Main { public static void main(String[] args) { int amount = 100; String account = "123123"; WechatClient wechatClient = new WechatClient(amount, account); wechatClient.forRecharge(); } }
運行結果:
開始調用服務器端進行充值
服務器端開始進行充值操作
充值操作完成
客戶:123123完成賬戶充值,金額:100