Design Pattern - Dispatcher Pattern

 

Dispatcher Pattern

上一篇聊了👉 Design Pattern - Observer Pattern

为了后续继续聊 Java IO-Netty,再谈下事件分发模式(Dispatcher Pattern)

定义

事件分发模式(Dispatcher Pattern) 模式是一种行为设计模式,用于将客户端的请求委托给多个不同的处理程序中的一个。该模式允许你将请求的处理逻辑与请求的接收逻辑分离,从而提高代码的可维护性和可扩展性。

Dispatcher模式详解

Dispatcher模式通常包含以下几个关键组件:

  • Dispatcher:负责接收请求并将其委托给相应的处理程序。
  • Event:定义请求的接口,通常包含一个执行方法。
  • ConcreteEvent:Event接口的具体实现,每个实现对应一个具体的处理程序。
  • EventListener:执行与请求相关的实际工作。

类图

示例代码

  1. // 事件类型,可以根据需要扩展
  2. public interface Event {
  3. String getEventType();
  4. }
  5. // 定义事件监听器接口
  6. public interface EventListener {
  7. void onEvent(Event event);
  8. }
  9. //Dispatcher类,用于注册监听器和分发事件
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. public class EventDispatcher {
  13. private Map<String, EventListener> listeners = new HashMap<>();
  14. public void registerListener(String eventType, EventListener listener) {
  15. listeners.put(eventType, listener);
  16. }
  17. public void dispatchEvent(Event event) {
  18. EventListener listener = listeners.get(event.getEventType());
  19. if (listener != null) {
  20. listener.onEvent(event);
  21. } else {
  22. System.out.println("No listener for event: " + event.getEventType());
  23. }
  24. }
  25. }
  26. // 创建具体的事件类
  27. public class ConcreteEvent implements Event {
  28. private String eventType;
  29. private Object data;
  30. public ConcreteEvent(String eventType, Object data) {
  31. this.eventType = eventType;
  32. this.data = data;
  33. }
  34. @Override
  35. public String getEventType() {
  36. return eventType;
  37. }
  38. public Object getData() {
  39. return data;
  40. }
  41. }
  42. //创建具体的事件监听器
  43. public class ConcreteEventListener implements EventListener {
  44. private String listenerType;
  45. public ConcreteEventListener(String type) {
  46. this.listenerType = type;
  47. }
  48. @Override
  49. public void onEvent(Event event) {
  50. if (event.getEventType().equals(listenerType)) {
  51. // 处理事件
  52. System.out.println("Handling event: " + event.getEventType());
  53. // 可以访问事件的数据
  54. System.out.println("Event data: " + ((ConcreteEvent) event).getData());
  55. }
  56. }
  57. }
  58. //演示整个Dispatcher模式的运作
  59. public class DispatcherDemo {
  60. public static void main(String[] args) {
  61. EventDispatcher dispatcher = new EventDispatcher();
  62. // 创建事件
  63. Event event1 = new ConcreteEvent("TYPE1", "Data for TYPE1");
  64. Event event2 = new ConcreteEvent("TYPE2", "Data for TYPE2");
  65. // 创建监听器
  66. EventListener listener1 = new ConcreteEventListener("TYPE1");
  67. EventListener listener2 = new ConcreteEventListener("TYPE2");
  68. // 注册监听器
  69. dispatcher.registerListener("TYPE1", listener1);
  70. dispatcher.registerListener("TYPE2", listener2);
  71. // 分发事件
  72. dispatcher.dispatchEvent(event1);
  73. dispatcher.dispatchEvent(event2);
  74. }
  75. }

总结

观察者模式(Observer Pattern)是一种特殊的事件分发模式(Dispatcher Pattern)

相同点

  1. 两者都解耦合 避免对象之间直接依赖。
  2. 两者都动态通讯 不要知道彼此的存在
  3. 两者都有注册机制

不同点

  1. 观察者模式(Observer Pattern) 1对多。一个特殊事件对所有的观察者。 1 To All
  2. 事件分发模式(Dispatcher Pattern) 多对多。多个正常事件对应多个接收者。
  3. 实现方式上:观察者模式(Observer Pattern) 有主题和观察者,事件分发模式(Dispatcher Pattern) 有 事件、分发器和接受者。可以将观察者模式(Observer Pattern) 中的事件看作为一个特殊的事件,因此内涵在观察者模式(Observer Pattern) 的主题中,观察者模式(Observer Pattern) 的主题等于特殊的事件+特殊的分发器

怎么做(How To)

如果数据量大分发器响应不过来了,接收者处理不过来了怎么办?😅

为了优化分发器,需要考虑的内容?阻塞、非阻塞、同步、异步?😅

为了优化接收者,需要考虑的内容?阻塞、非阻塞、同步、异步?😅

两者如何更好的配合?那就加上线程和IO往上干😂😂