我有一个带有对象request_type和其他字段数的Request对象。 request_type可以是'additionRequest','deletionRequest''informationRequest'。 基于request_type,Request对象中的其他字段将以不同的方式处理。
我简单的方法是
if additionRequest
algorithm1
else if deletionRequest
algorithm2
else if deletionRequest
algorithm3
end
如何避免这些if语句,并且仍然应用适当的算法?
答案 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()
}
答案 4 :(得分:0)
面向对象的解决方案始终是在数据中包含逻辑。在这种情况下,请在请求对象本身中包含您希望请求执行的操作,而不是(大概)传递纯数据。
类似
public interface Request {
Response apply();
}
其他任何事情,例如创建功能图,创建薄抽象层或应用某些模式,都是一种解决方法。仅当无法应用第一种解决方案时,这些才是合适的。如果Request
对象不受您的控制,例如自动生成或第三方类,则可能是这种情况。