Netty -Event Driven Model(如何理解Netty中的事件驱动模型)

如何理解Netty中的事件驱动模型

在现代软件开发中,事件驱动模型是处理用户交互、异步操作和复杂系统交互的关键技术。本文将深入探讨事件驱动模型的核心组件、事件驱动的步骤、事件与驱动的关系,并以Java语言为例,展示如何在实际编程中应用这一模型。

事件驱动模型的核心组件

事件驱动模型依赖于几个核心组件,它们共同作用以响应和处理事件。以下是这些组件的简要描述:

  • 事件源(Event Source) : 事件源是产生事件的对象
  • 事件对象(Event Object):事件对象是事件本身,封装了事件信息的实体
  • 事件监听器(Event Listener):事件监听器是用于监听特定事件的对象,用作通知分发等等
  • 事件处理器(Event Handler):用于处理事件

事件驱动的步骤

实现事件驱动模型通常遵循以下步骤:

  1. 首先,你需要定义一个事件源,事件,监听器,处理器
  2. 其次,创建监听器,在监听器中将事件和处理器绑定
  3. 具体实现处理器


事件和驱动的关系

  1. 事件和驱动之间的流转关系可以是同步/非同步,阻塞/非阻塞的
  2. 事件和驱动之间的映射关系可以是1对1,1对多,多对多
  3. 事件、监听器、驱动之间的关系,可以由事件和监听器流转关系 同步/非同步,阻塞/非阻塞 ➕监听器和驱动流转关系 同步/非同步,阻塞/非阻塞
  4. 事件、监听器、驱动的映射关系事件和监听器映射关系 1对1,1对多,多对多,监听器和驱动的映射关系1对1,1对多,多对多

由此将会产生*同步阻塞的1对1事件驱动,同步阻塞的1对多事件驱动,同步阻塞的多对多事件驱动,同步非阻塞的1对1事件驱动,同步非阻塞的1对多事件驱动同步非阻塞的多对多事件驱动* 等等2✖️2✖️3=12 种模式

常用事件驱动模式示例

同步阻塞的1对1的事件驱动-命令模式


  1. @startuml
  2. interface Command {
  3. +execute()
  4. }
  5. class Light {
  6. +turnOn() : void
  7. +turnOff() : void
  8. }
  9. class LightOnCommand {
  10. -light : Light
  11. +LightOnCommand(light : Light)
  12. +execute() : void
  13. }
  14. class LightOffCommand {
  15. -light : Light
  16. +LightOffCommand(light : Light)
  17. +execute() : void
  18. }
  19. class RemoteControl {
  20. -command : Command
  21. +setCommand(command : Command) : void
  22. +pressButton() : void
  23. }
  24. LightOnCommand o-- Light :lightOn
  25. LightOffCommand o-- Light : lightOff
  26. RemoteControl o-- Command : uses
  27. Command -->LightOnCommand
  28. Command -->LightOffCommand
  29. @enduml
  1. public interface Command {
  2. void execute();
  3. }
  4. public class LightOnCommand implements Command {
  5. private Light light;
  6. public LightOnCommand(Light light) {
  7. this.light = light;
  8. }
  9. @Override
  10. public void execute() {
  11. light.turnOn();
  12. }
  13. }
  14. public class LightOffCommand implements Command {
  15. private Light light;
  16. public LightOffCommand(Light light) {
  17. this.light = light;
  18. }
  19. @Override
  20. public void execute() {
  21. light.turnOff();
  22. }
  23. }
  24. public class Light {
  25. public void turnOn() {
  26. System.out.println("Light is on");
  27. }
  28. public void turnOff() {
  29. System.out.println("Light is off");
  30. }
  31. }
  32. public class RemoteControl {
  33. private Command command;
  34. public void setCommand(Command command) {
  35. this.command = command;
  36. }
  37. public void pressButton() {
  38. command.execute();
  39. }
  40. }
  41. public class Client {
  42. public static void main(String[] args) {
  43. Light light = new Light();
  44. Command lightOn = new LightOnCommand(light);
  45. Command lightOff = new LightOffCommand(light);
  46. RemoteControl remote = new RemoteControl();
  47. // Switching on the light
  48. remote.setCommand(lightOn);
  49. remote.pressButton();
  50. // Switching off the light
  51. remote.setCommand(lightOff);
  52. remote.pressButton();
  53. }
  54. }

同步阻塞的1对多的事件驱动-观察者模式


  1. @startuml
  2. interface Observer {
  3. +update(message : String) : void
  4. }
  5. interface Subject {
  6. +registerObserver(o : Observer) : void
  7. +removeObserver(o : Observer) : void
  8. +notifyObservers() : void
  9. }
  10. class MessageBoard {
  11. -observers : List<Observer>
  12. -message : String
  13. +MessageBoard()
  14. +setMessage(message : String) : void
  15. +registerObserver(o : Observer) : void
  16. +removeObserver(o : Observer) : void
  17. +notifyObservers() : void
  18. }
  19. class User {
  20. -name : String
  21. +User(name : String)
  22. +update(message : String) : void
  23. }
  24. class Client {
  25. +run() : void
  26. }
  27. Observer <|-- User
  28. Subject <|-- MessageBoard
  29. MessageBoard "1" o-- "many" Observer : notifies
  30. Client --> MessageBoard :regist/setMessage/notify
  31. @enduml
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public interface Observer {
  4. void update(String message);
  5. }
  6. public interface Subject {
  7. void registerObserver(Observer o);
  8. void removeObserver(Observer o);
  9. void notifyObservers();
  10. }
  11. public class MessageBoard implements Subject {
  12. private List<Observer> observers;
  13. private String message;
  14. public MessageBoard() {
  15. observers = new ArrayList<>();
  16. }
  17. public void setMessage(String message) {
  18. this.message = message;
  19. notifyObservers();
  20. }
  21. @Override
  22. public void registerObserver(Observer o) {
  23. observers.add(o);
  24. }
  25. @Override
  26. public void removeObserver(Observer o) {
  27. int i = observers.indexOf(o);
  28. if (i >= 0) {
  29. observers.remove(i);
  30. }
  31. }
  32. @Override
  33. public void notifyObservers() {
  34. for (Observer observer : observers) {
  35. observer.update(message);
  36. }
  37. }
  38. }
  39. public class User implements Observer {
  40. private String name;
  41. public User(String name) {
  42. this.name = name;
  43. }
  44. @Override
  45. public void update(String message) {
  46. System.out.println(name + " received message: " + message);
  47. }
  48. }
  49. public class ObserverPatternDemo {
  50. public static void main(String[] args) {
  51. MessageBoard messageBoard = new MessageBoard();
  52. User alice = new User("Alice");
  53. User bob = new User("Bob");
  54. messageBoard.registerObserver(alice);
  55. messageBoard.registerObserver(bob);
  56. messageBoard.setMessage("Hello Observer Pattern!");
  57. messageBoard.removeObserver(bob);
  58. messageBoard.setMessage("Updated message after removing Bob.");
  59. }
  60. }

同步阻塞的多对多的事件驱动-事件分发模式


  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. }

同步非阻塞的1对多的事件驱动模式-Reactor

该模式已经被同行吹的起飞了,就不详细说明了 示例: 略

其他排列组合的事件驱动模式

可能设计的还不够健壮,可能还没有应用到非常有名的软件中,但他是存在的,请勿忘记!!!

5. 结论

事件驱动模型是现代软件开发中不可或缺的一部分,它允许程序以各种不同的方式响应用户操作和其他事件。通过理解事件驱动模型的核心组件和实现步骤及关系,开发者可以更有效地构建响应式和高效的应用程序,可以更加高屋建瓴的理解市面上的一些所谓的高大上的知识点