一、什麼是回呼
回調,回調。要先有調用,才有調用者和被調用者之間的回調。所以在百度百科中是這樣的:
軟體模組之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和非同步調用。
回呼是一種特殊的調用,至於三種方式也有點不同。
1、同步回調,即阻塞,單向。
2、回調,即雙向(類似自行車的兩個齒輪)。
3、非同步調用,即透過非同步訊息進行通知。
二、CS中的非同步回呼(java案例)
例如這裡模擬個場景:客戶端發送msg給服務端,服務端處理後(5秒),回調給客戶端,告知處理成功。程式碼如下:
回呼介面類別:
public interface CSCallBack { public void process(String status); }
模擬客戶端:
public class Client implements CSCallBack { private Server server; public Client(Server server) { this.server = server; } public void sendMsg(final String msg){ System.out.println("客户端:发送的消息为:" + msg); new Thread(new Runnable() { @Override public void run() { server.getClientMsg(Client.this,msg); } }).start(); System.out.println("客户端:异步发送成功"); } @Override public void process(String status) { System.out.println("客户端:服务端回调状态为:" + status); } }
模擬服務端:
public class Server { public void getClientMsg(CSCallBack csCallBack , String msg) { System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg); // 模拟服务端需要对数据处理 try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("服务端:数据处理成功,返回成功状态 200"); String status = "200"; csCallBack.process(status); } }
測試類別:
public class CallBackTest { public static void main(String[] args) { Server server = new Server(); Client client = new Client(server); client.sendMsg("Server,Hello~"); } }
核心總結如下
客户端:发送的消息为:Server,Hello~ 客户端:异步发送成功 服务端:服务端接收到客户端发送的消息为:Server,Hello~ (这里模拟服务端对数据处理时间,等待5秒) 服务端:数据处理成功,返回成功状态 200客户端:服务端回调状态为:200
三、回呼的應用場景
回呼目前運用在什麼場景比較多呢?從作業系統到開發者呼叫:
1、接口作为方法参数,其实际传入引用指向的是实现类 2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。 3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。
補充:其中 Filter(過濾器)和Interceptor(攔截器)的區別,攔截器基於是Java的反射機制,和容器無關。但與回呼機制有異曲同工之妙。
總之,這設計讓底層程式碼呼叫高層定義(實作層)的子程序,增強了程式的彈性。
四、模式對比
上面講了Filter和Intercepter有著異曲同工之妙。其實介面回呼機制和一種設計模式—觀察者模式也有相似之處:
觀察者模式:
GOF說— 「定義物件的一種一對多的依賴關係,當一個物件的狀態發送改變的時候,所有對他依賴的物件都被通知到並更新。
介面回呼:
與觀察者模式的區別是,它是種原理,而非具體實現。
五、心得
總結四步驟:
機制,即原理。
模式,即是體現。記住具體場景,常見模式。
然後深入理解原理。