4

我的代码片段如下:

public void execute(Parameters params) {
    Long requestType = params.getRequestType();
    // Based on the requestType the name of the project would be different
    getName(requestType); 
    // Same as above
    getDescription(requestType) 
    // Project here is a collection of different requests
    Long projectId = createProject(name, description) 
    RequestContents requestContents = params.getRequestContents();
    for(RequestContent requestcontent : requestcontents) {
        Long requestId = createRequest(name, description, projectId);
        updateRequest(requestId, requestContent1);
    }
    // Based on the  requestType, mail content would differ 
    String mailContent = getMailContent(requestType, projectId) 
    sendMail(mailContent); 
}

函数sendMail, createProject,的输出createRequest取决于requestType,因此这些函数最终会具有多个if-else条件。为此类建模以避免这种情况的正确方法是什么?

4

4 回答 4

3

一种方法是创建一个AbstractRequest具有抽象方法sendMail等的抽象类createProject,然后有几个具体的子类RequestType1 RequestType2等,每个子类等都有不同的实现sendMail 等。我猜他们称之为策略模式。

于 2012-11-04T17:12:20.880 回答
1

使用双重调度

public class Sender {

    public void sendMail(RequestType1 requestType, String mailContent) {
        // some impl
    }
    public void sendMail(RequestType2 requestType, String mailContent) {
        // some impl
    }
    public void sendMail(RequestType3 requestType, String mailContent) {
        // some impl
    }
}

然后

sender.sendMail(requestType, mailContent);

实际调用的方法是在运行时根据requestType对象的类型确定的。看不到“如果”。


您可以简单地在本地实现这些方法,但这会令人困惑且难以阅读。最好将这个问题分成一个单独的类。

于 2012-11-04T17:12:47.057 回答
0

如果 requestType 是一组有限的 String 值,您可以为其创建一个匹配的 Enum。

enum RequestType{
    type1,type2,...;
}

然后,您可以将 if-else 转换为更紧凑的 switch-case:

switch (RequestType.valueOf(requestType)){
    case type1:
        ....
    break;
    case type2:
        ...
    break;
    ...
    default:
}

从代码来看,requestType是一个long,可以直接开启:

switch (requestType){
    case type1:
        ....
    break;
    case type2:
        ...
    break;
    ...
    default:
}
于 2012-11-04T17:14:06.560 回答
0

为什么不将 if-else 条件放在 execute() 方法本身并基于该条件调用其他方法并传递相关参数。这样,您将创建 sendmail、createproject、createrequest 的通用函数。

于 2012-11-04T17:14:35.753 回答