springboot学习(三)监听器 上

一:监听器模式介绍

当我们程序运行到某些关键节点的时候,会通过广播器将这些事件广播出去,系统中存在一些监听器,因为它们对这类事件感兴趣,所以这些监听器会去监听这些事件。当这些事件被广播出去后,这些监听器就会监听到这些事件,从而触发一些行为。

从上面介绍可以看出,监听模式的要素是:

  • 事件
  • 监听器
  • 广播器
  • 触发机制

可以结合这四个要素去手动实现一个监听器模式

1.定义事件

public abstract class GameEvent {

  public abstract String gameEvent();
}

public class ChatEvent extends GameEvent {

  @Override
  public String gameEvent() {
    return "聊天";
  }
}

public class LevelEvent extends GameEvent {

  @Override
  public String gameEvent() {
    return "打怪升级";
  }
}

2.定义监听器

public interface GameListener {

  void onGameEvent();
}

public class LevelListener implements GameListener {

  @Override
  public void onGameEvent() {
    System.out.println("玩家正在升级");
  }
}

public class ChatListener implements GameListener {

  @Override
  public void onGameEvent() {
    System.out.println("玩家正在聊天");
  }
}

3.定义广播器

public interface EventMulticaster {

  void multicasterEvent(GameEvent event);

  void addListener(GameListener weatherListener);

  void removeListener(GameListener weatherListener);
}

public abstract class AbstractEventMulticaster implements EventMulticaster {

  private List<GameListener> gameListenerList = new ArrayList<>();

  @Override
  public void multicasterEvent(GameEvent event) {
    doStart();
    gameListenerList.forEach(c->c.onGameEvent(event));
    doEnd();
  }

  @Override
  public void addListener(GameListener gameListener) {
    gameListenerList.add(gameListener);
  }

  @Override
  public void removeListener(GameListener gameListener) {
    gameListenerList.remove(gameListener);
  }

  abstract void doStart();

  abstract void doEnd();
}

public class GameEventMulticaster extends AbstractEventMulticaster {

  @Override
  void doStart() {
    System.out.println("开始广播事件");
  }

  @Override
  void doEnd() {
    System.out.println("结束广播事件");
  }
}

到这里我们监听器就已经写完了,下面通过一个test类去试验下

public class Test {

  public static void main(String[] args) {
    GameEventMulticaster gameEventMulticaster = new GameEventMulticaster();
    ChatListener chatListener = new ChatListener();
    LevelListener levelListener = new LevelListener();
    gameEventMulticaster.addListener(chatListener);
    gameEventMulticaster.addListener(levelListener);
    gameEventMulticaster.multicasterEvent(new ChatEvent());
    gameEventMulticaster.multicasterEvent(new LevelEvent());
    gameEventMulticaster.removeListener(levelListener);
    gameEventMulticaster.multicasterEvent(new ChatEvent());
    gameEventMulticaster.multicasterEvent(new LevelEvent());
  }
}

最终结果:

猜你喜欢

转载自blog.csdn.net/qq_33302985/article/details/106189007