首页 > 解决方案 > 根据值实现不同流程的最佳设计是什么?

问题描述

在此先感谢您的帮助。我正在设计一个新的基于 Java Spring Boot 的应用程序,负责根据输入参数返回状态。根据此输入参数,要实现最终状态,必须创建不同的流程,尽管有时它们在流程之间共享功能。

我正在考虑实现这个想法的最佳方式,我一直在寻找不同的设计模式,但我没有找到正确的设计,我可能是一个糟糕的寻求者......

应用程序通过 REST 端点接收请求并处理它。我的想法如下:

1)创建一个涉及主要功能的接口:

@FunctionalInterface
public interface StatusService {
    Response getStatus(Request request);
}

2)实现主要功能并调用类选择器:

@Service
public class StatusServiceImpl implements StatusService {

   @Autowired // Yes, constructor injection it's better ;)
   private Selector selector; 

    @Override
    public Response getStatus(Request request) {
        validateRequest(request);
        UserInfo userInfo = getCommonInfoByRequest(request);
        return selector.getStatusSelectingWorkFlow(userInfo);
    }
}

3) 使用控制流语句实现选择器:

@Component
public class Selector {

   @Autowired
      private WorkFlowAImpl a;

    public Response getStatusSelectingWorkFlow(UserInfo userInfo) {
        System.out.println("Selecting workflow by param from request");
        switch (WorkFlowsEnum.valueOf(request.getParam())) {
        case A:
            return a.getStatus(userInfo)
        case B:
             return // Workflow 'b'
        case C:
        case D:
             return // Workflow 'C' and 'D'
        default:
           System.out.println("Unconsidered workflow");
           break;
         }
    }
 }

有人可以就这个想法或更好的选择给我他们的观点吗?

感谢您的时间

标签: javadesign-patternsworkflow

解决方案


Strategy PatternIMO的经典示例。

Map<WorkFlowsEnum, StatusService> map = new HashMap<>();
map.put(WorkFlowsEnum.SOME, new SomeInstanceOfStatusService());   
// ... all others

当您需要根据以下内容完成某些事情时WorkFlowsEnum

public Response getItDone(WorkFlowsEnum value, Request request){
    return map.get(value).getStatus(request);
}

推荐阅读