一、目的
这篇文章的主要目的就是为了优化甚至是解决类似功能的架构设计难题,让后续维护以及拓展工作省时省力,一看就会,即时上手,再也不用担心自己的头发了。
二、设计模式
方案中用到三种设计模式:
外观模式:
意图---为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
优点---1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点---不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
策略模式:
意图---定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
优点---1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺陷---1、策略类会增多。 2、所有策略类都需要对外暴露。
桥接模式:
意图---将抽象部分与实现部分分离,使它们都可以独立的变化。
优点---1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺陷---桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
了解更多设计模式:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
三、关键衔接知识点
Spring高级注入:
目的:一次性注入接口的所有实现类,不需要关心具体实现类,实现类之间互不影响,删除或者新增实现变得简单,需要变动的代码极少。
更多Spring高级注入的知识各自深入,此处不再赘述!
四、设计图
五、不废话,直接上代码
1、创建策略接口【策略模式】
public interface ProcessHandlerService {
/**
* 流程类型
*
* @return
*/
ProcessTypeEnum handlerType();
/**
* 发起流程
*
* @param request
*/
void startProcess(StartProcessRequest request);
/**
* 流程审批
*
* @param request
*/
void approvalProcess(ApprovalProcessRequest request);
/**
* 获取流程详情
*
* @param request
* @return
*/
ProcessDetailResponse detail(ProcessDetailRequest request);
}
2、创建桥接能力接口【桥接模式】
public interface ProcessInternalService {
/**
* 流程预校验
*/
void processPreCheck();
/**
* 生成流程标题
*
* @return
*/
String generateProcessTitle();
}
3、创建一个公共的实现策略【策略模式】
abstract class AbstractProcessHandlerService implements ProcessHandlerService {
/**
* 获取桥接接口能力对象
*
* @return
*/
abstract ProcessInternalService getProcessInternalService();
@Override
public void startProcess(StartProcessRequest request) {
}
@Override
public void approvalProcess(ApprovalProcessRequest request) {
}
@Override
public ProcessDetailResponse detail(ProcessDetailRequest request) {
return new ProcessDetailResponse();
}
}
4、创建具体的策略实现xxx【策略模式】
@Service
public class XXXProcessHandlerService extends AbstractProcessHandlerService {
@Autowired
private XXXProcessInternalService xxxProcessInternalService;
@Override
ProcessInternalService getProcessInternalService() {
return xxxProcessInternalService;
}
@Override
public ProcessTypeEnum handlerType() {
return ProcessTypeEnum.XXX;
}
}
5、创建具体的策略实现yyy【策略模式】
@Service
public class YYYProcessHandlerService extends AbstractProcessHandlerService {
@Autowired
private YYYProcessInternalService yyyProcessInternalService;
@Override
ProcessInternalService getProcessInternalService() {
return yyyProcessInternalService;
}
@Override
public ProcessTypeEnum handlerType() {
return ProcessTypeEnum.YYY;
}
}
6、创建具体的桥接能力接口实现xxx【桥接模式】
@Service
public class XXXProcessInternalService implements ProcessInternalService {
@Override
public void processPreCheck() {
}
@Override
public String generateProcessTitle() {
return "xxx";
}
}
7、创建具体的桥接能力接口实现yyy【桥接模式】
@Service
public class YYYProcessInternalService implements ProcessInternalService {
@Override
public void processPreCheck() {
}
@Override
public String generateProcessTitle() {
return "yyy";
}
}
8、创建流程外观能力接口【外观模式】
public interface ProcessFacadeService {
/**
* 发起流程
*
* @param request
*/
void startProcess(StartProcessRequest request);
/**
* 审批流程
*
* @param request
*/
void approvalProcess(ApprovalProcessRequest request);
/**
* 获取流程详情
*
* @param request
* @return
*/
ProcessDetailResponse detail(ProcessDetailRequest request);
}
9、流程外观能力接口实现【外观模式、spring高级注入】
@Service
public class ProcessFacadeServiceImpl implements ProcessFacadeService {
private static Map<ProcessTypeEnum, ProcessHandlerService> handlerServices;
// 【spring构造器高级注入】
@Autowired
public ProcessFacadeServiceImpl(List<ProcessHandlerService> handlers) {
handlerServices = handlers.stream().collect(
Collectors.toMap(ProcessHandlerService::handlerType,
processHandlerService -> processHandlerService));
}
@Override
public void startProcess(StartProcessRequest request) {
handlerServices.get(request.getProcessType()).startProcess(request);
}
@Override
public void approvalProcess(ApprovalProcessRequest request) {
handlerServices.get(request.getProcessType()).approvalProcess(request);
}
@Override
public ProcessDetailResponse detail(ProcessDetailRequest request) {
return handlerServices.get(request.getProcessType()).detail(request);
}
}
10、创建web层接口
@RestController
@RequestMapping("/process")
public class ProcessController {
@Autowired
private ProcessFacadeService processFacadeService;
/**
* 流程发起
*
* @param request
* @return
*/
@PostMapping("/start")
public Boolean startProcess(@RequestBody StartProcessRequest request) {
processFacadeService.startProcess(request);
return Boolean.TRUE;
}
/**
* 流程审批
*
* @param request
* @return
*/
@PostMapping("/approval")
public Boolean approvalProcess(@RequestBody ApprovalProcessRequest request) {
processFacadeService.approvalProcess(request);
return Boolean.TRUE;
}
/**
* 获取流程详情
*
* @param request
* @return
*/
@PostMapping("/detail")
public ProcessDetailResponse detail(@RequestBody ProcessDetailRequest request) {
return processFacadeService.detail(request);
}
}
六、总结
小弟在此抛砖引玉,还请各位大佬伸出大腿让我抱一抱!