Java利用listener實(shí)現(xiàn)回調(diào),即觀察者模式

java中實(shí)現(xiàn)觀察者模式有很多種方式,上一篇文章介紹到了,利用callback的方式實(shí)現(xiàn)了回調(diào),這篇文章準(zhǔn)備介紹的是利用listener實(shí)現(xiàn)回調(diào)。


Java回調(diào)機(jī)制

根據(jù)實(shí)時(shí)性劃分:

實(shí)現(xiàn)方式

這兩種實(shí)現(xiàn)方式本質(zhì)上是類似的,應(yīng)用場景略有不同,如果有熟知安卓的朋友應(yīng)該可以知道,在為一個(gè)view添加點(diǎn)擊實(shí)現(xiàn)的時(shí)候是有兩種方式的

  1. 利用callback來實(shí)現(xiàn)
view.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View view) {
                
            }
        });

2.實(shí)現(xiàn)View.OnClickListener接口

public class Test extends AppCompatActivity implements View.OnClickListener {
    private Button button;

    @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        button = (Button) findViewById(R.id.ac_video_btn_getValue);
        button.setOnClickListener(this);
    }

    @Override public void onClick(View view) {
        //TODO
    }
}



回調(diào)的本質(zhì)

其實(shí)無論哪種方式來實(shí)現(xiàn)回調(diào),利用的思想都是觀察者模式,即在我們選擇訂閱之后,當(dāng)對(duì)方做出任何舉動(dòng)的時(shí)候會(huì)給我們發(fā)送一條信息,這樣做的好處是省著我們用一個(gè)新的線程輪訓(xùn)檢測對(duì)方的狀態(tài),可以節(jié)省很多的資源。

應(yīng)用的場景

  • 如果我們需要將信息一層一層的返回去的時(shí)候,正如我下面的例子,那么可能用listener更為適合我們,因?yàn)槲覀兛梢詫⑦@個(gè)listener進(jìn)行傳遞,在需要查看數(shù)據(jù)的時(shí)候進(jìn)行回調(diào)它?;蛘弋?dāng)我們有很多事件需要回調(diào)的時(shí)候,可以實(shí)現(xiàn)一個(gè)listener然后發(fā)送不同的信息,進(jìn)行區(qū)分。這樣代碼看起來會(huì)簡潔一些,不會(huì)像callback一樣,會(huì)嵌套很多層,也不會(huì)寫出很多個(gè)callback來。

  • 如果我們只有一處,或者簡單的幾處需要回調(diào)的話,那么我們完全可以不用實(shí)現(xiàn)這個(gè)接口,而是用callback的方式來進(jìn)行處理。


還是舉一個(gè)簡單的生活中的例子吧,在公司中有一件事情,老板想要問員工,但是老板只能聯(lián)系到部門經(jīng)理,那么便有了,A問B,B問C,C經(jīng)過思考,回答了B,B又將答案告訴了A,A知道了答案,便高興的說了出來。


我下面的代碼采用了單例模式來寫:

Listner.java

public interface Listener {
    void onFinish(String msg);
}
People.java

public class People implements Listener {

    private static People people;

    private People() {

    }

    synchronized public static People getInstance() {
        if (people == null) {
            people = new People();
        }
        return people;
    }

    public void askPeople2() {
        People2.getInstance().askPeople3(this);
    }

    @Override
    public void onFinish(String msg) {
        System.out.println("收到的消息是 ---> " + msg);
    }

}
People2.java

public class People2 {

    private static People2 people2;

    private People2() {

    }

    synchronized public static People2 getInstance() {
        if (people2 == null)
            people2 = new People2();
        return people2;
    }
    
    public void askPeople3(Listener listener){
        People3.getInstance().thinking(listener);
    }

}
People3.java

public class People3 {

    private static People3 people3;

    private People3() {

    }

    synchronized public static People3 getInstance() {
        if (people3 == null)
            people3 = new People3();
        return people3;
    }

    public void thinking(Listener listener3) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        listener3.onFinish("我已經(jīng)思考完畢");
    }

}

result
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,241評(píng)論 0 1
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,358評(píng)論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,156評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 一個(gè)小孩問她的母親, 媽媽,為什么大人都想變成小孩, 而小孩都希望自己變成大人呢。 她的母親說,因?yàn)槿硕际亲运降摹?/div>
    九櫟閱讀 197評(píng)論 0 0

友情鏈接更多精彩內(nèi)容