java之回撥函式!!

image.png
高內聚,低耦合。現在網際網路體系經常提及的架構方案,目前很多框架也是遵從這個原則來實現整體的架構。而模組與模組之間的解耦也有很多方法。 回撥函式,也是這樣的一種方法。
關於回撥函式,有這這樣一個經典的例子。
有一天小王遇到一個很難的問題,問題是“1 + 1 = ?”,就打電話問小李,小李一下子也不知道,就跟小王說,等我辦完手上的事情,就去想想答案,小王也不會傻傻的拿著電話去等小李的答案吧,於是小王就對小李說,我還要去逛街,你知道了答案就打我電話告訴我,於是掛了電話,自己辦自己的事情,過了一個小時,小李打了小王的電話,告訴他答案是2
應用到具體的例子中, 就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法。
首先,要定義一個介面
public interface Callback { public void solve(); }

image.png
- 首先,A有個問題,需要呼叫B的方法進行解決
- 然後B也不知道怎麼解決,發現A中過來的方法有個方法實現了我們定義的介面,就去呼叫他。
- 然後就解決了問題。
簡單的總結一下,就是我們本身去呼叫一個方法的時候,我們本身已經實現了具體的功能。然後讓我們呼叫的方法,反過來呼叫我們的實現方法。這就是回撥函式。
public interface MyAdd{ int addSolve(int a , int b); } // 解決1+1 等於幾的函式 public int OneAddOne(MyAdd myAdd){ int a = 1; int b = 1; return myAdd.addSolve(a,b); } public void Tests(){ /** * 現在我們這個方法有個需求,是解決1+1 等於幾。 * 然後我們自己定義的方法一加一等於幾已經寫好了 * 但是,我們呼叫的是我們自己定義的介面,具體的實現還不知道。 * 這時候,我們就需要把我們的實現一起帶過去 */ int res = OneAddOne((a,b)->a+b); System.out.println(res); /** * 這樣,我們就可以知道1+1等於幾了,而帶過去的lambda就是我們的回撥函式 * 我們呼叫OneAddOne方法,然後這個方法反過來呼叫我們帶過去的具體實現 * 這跟java8裡面的行為引數化差不多 */ }
那我們為什麼需要這樣設計呢,就為了解決這個1+1這樣簡單的問題?
肯定不是啊,如果下次給你一個問題是2+2,3+3,你是不是都要還弄一個方法來具體的解決這個問題?如果我們把行為給引數化,再結合泛型的實現,基本上可以打造通用的模板實現。
public interface MyAdd<T>{ T addSolve(T a , T b); } // 幾加幾的問題 public <T> T OneAddOne(MyAdd<T> myAdd,T a,T b){ return myAdd.addSolve(a,b); } public void Tests(){ //1+1 Integer res = OneAddOne((Integer a, Integer b) -> a + b, 1, 1); //2.2 + 2.2 Double res1 = OneAddOne((Double a, Double b) -> a + b, 2.2, 2.2); }
再面對需求多變的時候,採用這樣的方式,會讓你的程式碼質量更上一層樓。