如何避免

时间:2019-04-17 14:27:54

标签: java oop

我有一个带有对象request_type和其他字段数的Request对象。 request_type可以是'additionRequest','deletionRequest''informationRequest'。 基于request_type,Request对象中的其他字段将以不同的方式处理。

我简单的方法是

if additionRequest
algorithm1
else if deletionRequest
algorithm2
else if deletionRequest
algorithm3
end

如何避免这些if语句,并且仍然应用适当的算法?

5 个答案:

答案 0 :(得分:4)

如果要避免使用条件语句,则可以利用面向对象的功能,例如:

@Override
public int getChildrenCount(int i) {
    return listHashMap.get(listDataHeader.get(i)).size();
}

答案 1 :(得分:0)

在这种情况下,请使用HashMap<RequestType, RequestHandler>。 RequestHandler可以是将针对您要处理的每种情况实现的接口。

希望获得帮助。

答案 2 :(得分:0)

您可以创建键:字符串,值:RequestType ReturnType的函数的Map。根据请求的类型,它将调用相应的函数。

示例:

  Map<String, Function<RequestType, ResponseType> requestProcessors = new HashMap<>;
  requestProcessors.add("additionRequest", this::methodToHandleAddRequest);
  requestProcessors.add("deletionRequest", this::methodToHandleDeleteRequest);

内部请求处理程序执行

 return this.requestProcessors.get(request.request_type).apply(request);

请注意,如果不同的响应不同,则可能必须创建响应界面。不同的响应类型将从响应接口继承

答案 3 :(得分:0)

在我看来,这里的命令模式也许会派上用场。如果创建这些命令的对象结构并将要执行的算法封装在该对象内,则可以构造特定的子对象,然后在以后使用命令的“ execute”方法来调用算法。只要确保您使用的是多态引用:

if additionRequest
  algorithm1
else if deletionRequest
  algorithm2
else if deletionRequest
  algorithm3
end

将成为

void theRequestExecutor(Reqest req) {
    req.executeAlgorithm()
}

https://en.wikipedia.org/wiki/Command_pattern

答案 4 :(得分:0)

面向对象的解决方案始终是在数据中包含逻辑。在这种情况下,请在请求对象本身中包含您希望请求执行的操作,而不是(大概)传递纯数据。

类似

public interface Request {
    Response apply();
}

其他任何事情,例如创建功能图,创建薄抽象层或应用某些模式,都是一种解决方法。仅当无法应用第一种解决方案时,这些才是合适的。如果Request对象不受您的控制,例如自动生成或第三方类,则可能是这种情况。