下面,我们将为Trigger
类添加一些更复杂的功能:
- 异常处理:确保事件处理期间发生的任何异常都不会导致整个触发器系统崩溃。
- 同步:确保事件处理是线程安全的,防止并发问题。
- 事件参数:允许事件处理函数接收参数。
- 事件链:允许一个事件触发另一个事件。
以下是更新后的Trigger
类,包含了这些复杂功能:
java
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Trigger {
private Map<T, Runnable> eventHandlers = new HashMap<>();
private ExecutorService executorService = Executors.newCachedThreadPool();
// 注册事件和对应的处理函数
public void registerEvent(T event, Runnable handler) {
eventHandlers.put(event, handler);
}
// 触发事件,可以传递参数
public void triggerEvent(T event, Object... args) {
if (eventHandlers.containsKey(event)) {
executorService.submit(() -> {
try {
// 创建一个带参数的适配器,以便传递给处理函数
eventHandlers.get(event).run();
} catch (Exception e) {
System.err.println("Error occurred while handling event: " + event);
e.printStackTrace();
}
});
} else {
System.out.println("No handler registered for event: " + event);
}
}
// 注册事件链,一个事件触发另一个事件
public void registerEventChain(T event, T chainedEvent) {
if (eventHandlers.containsKey(chainedEvent)) {
registerEvent(event, () -> {
System.out.println("Chained event triggered: " + chainedEvent);
triggerEvent(chainedEvent);
});
} else {
System.out.println("No handler registered for chained event: " + chainedEvent);
}
}
// 关闭线程池
public void shutdown() {
executorService.shutdown();
}
public static void main(String[] args) {
Trigger<String> trigger = new Trigger<>();
// 注册登录事件处理函数
trigger.registerEvent("login", () -> {
System.out.println("User logged in.");
// 登录逻辑...
});
// 注册登出事件处理函数
trigger.registerEvent("logout", () -> {
System.out.println("User logged out.");
// 登出逻辑...
});
// 注册一个事件链,登录后触发检查用户权限事件
trigger.registerEventChain("login", "checkUserPermissions");
// 注册检查用户权限事件处理函数
trigger.registerEvent("checkUserPermissions", () -> {
System.out.println("Checking user permissions...");
// 检查用户权限逻辑...
});
// 触发登录事件,这将自动触发检查用户权限事件
trigger.triggerEvent("login");
// 触发登出事件
trigger.triggerEvent("logout");
// 关闭线程池
trigger.shutdown();
}
}
在这个例子中,我们添加了以下功能:
- 异常处理:通过在单独的线程中运行事件处理函数,并捕获可能抛出的任何异常,确保了系统的稳定性。
- 同步:通过使用线程池
ExecutorService
来处理事件,我们保证了事件处理的线程安全。 - 事件参数:
triggerEvent
方法现在可以接收一个可变参数列表,这样就可以传递参数给事件处理函数。不过,在这个例子中,我们没有具体实现如何将这些参数传递给事件处理函数,因为Runnable
接口不接收参数。实际应用中,可以自定义一个Consumer
接口或者使用其他方式来处理参数。 - 事件链:通过
registerEventChain
方法,我们允许一个事件触发另一个事件。当第一个事件处理完成后,第二个事件会被自动触发。
请注意,这个示例仍然是一个简化的模拟,实际应用中可能需要更复杂的设计,比如更精细的线程控制、事件参数传递机制、事件处理结果的反馈等。