将数据传递给事件处理程序的优雅方式?

时间:2014-12-25 02:00:13

标签: java structure organization

我们在Java中有一个webapp,用户可以订阅接收有关某些事件的电子邮件。他们可以使用可以使用的参数提供他们希望收到的消息,例如%DATE%%TOTAL_DOWNLOADS%,这些参数将替换为相应的值。

目前,用其值替换参数的代码是每个特定事件的代码。例如,对于其他用户下载文件的事件,我们的代码如下:

handleFileDownload(){
    ...
    if(user.notifyOnFileDownload){
        String message = user.fileDownloadNotifyMessage.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...);
        ...
        sendMessage(message);
    }
}

..或个人信息:

handlePersonalMessage(){
    ...
    if(user.notifyOnPersonalMessage){
        String message = user.personalMessageNotifyMessage.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...)
            .replaceAll("%SENDER%", sendingUser.username);
        ...
        sendMessage(message);
    }
}

拥有在多个地方处理参数的代码使得添加任何新参数或更改我们处理现有参数的方式变得非常困难,因为必须更新发送通知消息的所有地方。集中这些代码似乎是一个更好的主意,例如:

class User{
    ...
    handleNotificationsForEvent(EventType et){
        if(!subscribedToEventType(et)) return;
        String message = getMessageForEventType(et);
        message = message.replaceAll("%DATE%", user.formatDate(new Date())).replaceAll("%TOTAL_DOWNLOADS%", ...);
        ...
        sendMessage(message);
    }
}

以便其他代码成为:

handleFileDownload(){
    ...
    user.handleNotificationsForEvent(EventType.FILE_DOWNLOAD);
}


handlePersonalMessage(){
    ...
    user.handleNotificationsForEvent(EventType.PERSONAL_MESSAGE);
}

但是,许多参数都是特定于事件的,因此事件的代码要么必须发送必要的数据,要么替换这些特定的参数本身。例如,对于个人消息,发件人的姓名和个人消息的主题是两个参数。

我能想到的最好的方法是创建一个用于保存数据的类并在事件处理程序中填充必要的字段:

class EventData{
    public String personalMessageSender;
    public String personalMessageSubject;
    public String downloadedFileName;
}

handleFileDownload(){
    ...
    EventData ed = new EventData();
    ed.downloadedFileName = fileName;
    user.handleNotificationsForEvent(EventType.FILE_DOWNLOAD, ed);
}

handlePersonalMessage(){
    ...
    EventData ed = new EventData();
    ed.personalMessageSender = sender;
    user.handleNotificationsForEvent(EventType.PERSONAL_MESSAGE, ed);
}

..但这似乎太复杂了。

如果我有时需要特定于导致通知的事件的数据,我如何集中处理通知消息中的参数呢?

0 个答案:

没有答案