在項目開發中,會遇到以下情形:咱們本身的服務訂閱、接收來自消息隊列或者客戶端的事件和請求,基於不一樣的事件採起對應的行動,這種狀況下適合應用派發器模式。java
package org.java.learn.java8.dispatcher;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 21:53 */
@Component
public class XXXEventDispatcher implements AutoCloseable {
@Resource
private XXXEventHandlerInitializer initializer;
private Map<XXXEventType, XXXEventHandler> handlers = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
//創建綁定關係;
initializer.init();
//監聽事件並派發
dispatch("testMsg");
}
/** * 將XXX事件註冊到派發器 * * @param xxxEventType * @param xxxEventHandler */
public void bind(XXXEventType xxxEventType, XXXEventHandler xxxEventHandler) {
this.handlers.put(xxxEventType, ((eventType, context) -> {
try {
xxxEventHandler.handle(eventType, context);
} catch (Exception e) {
//記錄錯誤日誌
e.printStackTrace();
}
//打印處理器執行日誌
}));
}
/** * 進行事件派發 * @param eventMsg */
private void dispatch(String eventMsg) {
//(1) 從eventMsg中獲取eventType;
//(2) 根據eventMsg構造eventContext;
//(3) 執行具體的處理器方法
}
public void close() throws Exception {
//釋放資源
}
}
複製代碼
package org.java.learn.java8.dispatcher;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 21:56 */
@Component
public class XXXEventHandlerInitializer {
@Resource
private XXXEventDispatcher dispatcher;
public void init() {
dispatcher.bind(XXXEventType.event1, this::handleProcess1);
dispatcher.bind(XXXEventType.event2, this::handleProcess2);
dispatcher.bind(XXXEventType.event3, this::handleProcess3);
}
private void handleProcess1(XXXEventType eventType, XXXEventContext context) {
//事件1的處理邏輯
}
private void handleProcess2(XXXEventType eventType, XXXEventContext context) {
//事件2的處理邏輯
}
private void handleProcess3(XXXEventType eventType, XXXEventContext context) {
//事件3的處理邏輯
}
}
複製代碼
package org.java.learn.java8.dispatcher;
/** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:03 */
@FunctionalInterface
public interface XXXEventHandler {
void handle(XXXEventType eventType, XXXEventContext context);
}
複製代碼
package org.java.learn.java8.dispatcher;
/** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:04 */
public class XXXEventContext {
private int param1;
private int param2;
@Override
public String toString() {
return "XXXEventContext{" +
"param1=" + param1 +
", param2=" + param2 +
'}';
}
}
複製代碼
package org.java.learn.java8.dispatcher;
/** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:03 */
public enum XXXEventType {
event1,
event2,
event3
}
複製代碼
總結:在企業級開發中,有不少典型的應用場景和模式,事件派發器只是其中的一種,但願你也可以根據本身的實際狀況加以應用。本文中提到的代碼,參見個人github:LearnJavagit
本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。github