一:监听器模式介绍
当我们程序运行到某些关键节点的时候,会通过广播器将这些事件广播出去,系统中存在一些监听器,因为它们对这类事件感兴趣,所以这些监听器会去监听这些事件。当这些事件被广播出去后,这些监听器就会监听到这些事件,从而触发一些行为。
从上面介绍可以看出,监听模式的要素是:
- 事件
- 监听器
- 广播器
- 触发机制
可以结合这四个要素去手动实现一个监听器模式
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());
}
}
最终结果: