ejabberd源碼學習——方法註冊模式

來源:互聯網
上載者:User

標籤:

什麼叫方法註冊模式?

      簡言之,就是在方法被調用之前,先將方法名與調用此方法的觸發條件的關鍵字建立一種映射關係,當指定的觸發條件成立時,相應的方法則將會被調用。稱之為方法註冊模式,實乃一家之言,關鍵囿於人懶,從而書讀得少,代碼寫得寡。閑話休談,待入正題。

     在學習ejabberd源碼(版本14.07)中,發現通過配置表就可以使得某些模組啟用或不啟用,相當靈活,其主要是通過利用第一段所說的方法註冊模式來實現。可以發現很多mod_xxx模組的start方法中都有下面兩個方法的調用:

      gen_iq_handler:add_iq_handler(Component, Host, NS, Module, Function,Type);

      ejabberd_hooks:add(Hook, Host, Module, Function, Seq);

 

而其stop方法中則都有

     gen_iq_handler:remove_iq_handler(Component, Host, NS);

     ejabberd_hooks:delete(Hook, Host, Module, Function, Seq);

 

前後start與stop方法中的以上方法調用是一一對應的。其功能就相當於是註冊與登出。深入查看裡層的代碼,會發現gen_iq_handler:add_iq_handler/6 與 ejabberd_hooks:add/5方法是將方法名與方法的觸發條件寫入ets中,從而建立一種映射關係, gen_iq_handler:remove_iq_handler/3與ejabberd_hooks:delete/5則是將之前建立的映射關係刪除。

 

     在建立了方法名與方法的觸發條件關鍵字的映射關係後,在後續過程,就可以通過觸發條件關鍵字來尋找到相對於的模組方法名,進而相應的模組方法得於執行。比如ejabberd_sm模組中維護了iq包的處理方法映射關係,ejabberd_hooks模組中則維護了各種各樣的hooks,在收到不同的iq包時,通過xmlns值或原子值,在ets中尋找到相應的處理方法。在很多不同的業務處理時,通過此種方式可以避免條件陳述式判斷過長,模組劃分更方法,更有利於人員分工編寫,同時有很大的靈活性(可以啟用某些模組,也可不啟用)。

 

   上述方式得益於erlang是一種動態語言,模組、方法名可以賦於一個變數,通過變數來執行。其實在物件導向語言中,這恰恰就是多態特性的拿手好戲,通過父類/介面類來聲明一致的介面方法, 建立父類指標/引用與關鍵字的映射關係,進而達到以上類似的效果。

 

ejabberd源碼學習——方法註冊模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.