设计模式-责任链-项目真实践
责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
在以下条件下可考虑使用Chain of Responsibility:
1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。
实现
我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。
步骤 1
创建抽象的记录器类。
AbstractLogger.java
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
//责任链中的下一个元素
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger){
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message){
if(this.level <= level){
write(message);
}
if(nextLogger !=null){
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
步骤 2
创建扩展了该记录器类的实体类。
ConsoleLogger.java
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger: " + message);
}
}
ErrorLogger.java
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
FileLogger.java
public class FileLogger extends AbstractLogger {
public FileLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
步骤 3
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
ChainPatternDemo.java
public class ChainPatternDemo {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO,
"This is an information.");
loggerChain.logMessage(AbstractLogger.DEBUG,
"This is an debug level information.");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}
}
步骤 4
执行程序,输出结果:
Standard Console::Logger: This is an information.
File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.
项目应用
package com.bdyh.activiti.Pattern.businesstype;
import com.bdyh.activiti.controller.ActTaskController;
import com.bdyh.activiti.service.ActCategoryService;
import com.bdyh.common.activiti.entity.ActProcess;
import com.bdyh.common.activiti.vo.TaskAndHistoryVo;
import com.bdyh.common.common.sys.User;
import org.apache.poi.ss.formula.functions.T;
import java.util.List;
/**
* @description:
* @author: 田培融
* @date: 2019-08-09 10:07
*/
public abstract class AbstractResponsibilityBusiness {
protected String businessType;
private AbstractResponsibilityBusiness nextBusiness;
public void setNextBusiness(AbstractResponsibilityBusiness abstractResponsibilityBusiness){
this.nextBusiness = abstractResponsibilityBusiness;
}
public void doHandler(String business_type, ActProcess actProcess, User user,List<TaskAndHistoryVo> list, ActTaskController ActTaskController){
if (this.businessType.equals(business_type)){
handler(actProcess,user,list,ActTaskController);
}
if (nextBusiness != null){
nextBusiness.doHandler(business_type,actProcess,user,list,ActTaskController);
}
}
abstract protected void handler( ActProcess actProcess, User user, List<TaskAndHistoryVo> list ,ActTaskController ActTaskController );
}
package com.bdyh.activiti.Pattern.businesstype;
import com.bdyh.activiti.controller.ActTaskController;
import com.bdyh.common.activiti.entity.ActCategory;
import com.bdyh.common.activiti.entity.ActProcess;
import com.bdyh.common.common.sys.User;
import java.util.List;
/**
* @description:
* @author: 田培融
* @date: 2019-08-09 10:30
*/
public class ContractResponsibility extends AbstractResponsibilityBusiness {
public ContractResponsibility(String businessType) {
this.businessType =businessType;
}
@Override
protected void handler( ActProcess actProcess, User user, List list , ActTaskController actTaskController) {
ActCategory actCategory = new ActCategory();
actCategory.setTitle("合同流程");
actCategory.setTenantId(user.getTenantId());
actCategory = actTaskController.getActCategoryService().getByTitleAndTenantId(actCategory);
actProcess.setCategoryId(actCategory.getId());
}
}
package com.bdyh.activiti.Pattern.businesstype;
import com.bdyh.activiti.controller.ActTaskController;
import com.bdyh.common.activiti.entity.ActCategory;
import com.bdyh.common.activiti.entity.ActProcess;
import com.bdyh.common.activiti.vo.TaskAndHistoryVo;
import com.bdyh.common.common.sys.User;
import com.bdyh.common.delegation.vo.DelegationVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* @description:
* @author: 田培融
* @date: 2019-08-09 10:34
*/
public class DelegationResponsibility extends AbstractResponsibilityBusiness {
public DelegationResponsibility(String businessType) {
this.businessType = businessType;
}
@Override
protected void handler( ActProcess actProcess, User user, List<TaskAndHistoryVo> list, ActTaskController actTaskController) {
if (CollectionUtils.isNotEmpty(list)){
for (TaskAndHistoryVo taskAndHistoryVo : list) {
String institutionId = taskAndHistoryVo.getTableId();
DelegationVO result = actTaskController.getDelegationDraftClient().findById(institutionId).getResult();
if (!ObjectUtils.isEmpty(result)){
taskAndHistoryVo.setAuthNumber(result.getAuthNumber());
taskAndHistoryVo.setAuthType(result.getAuthType());
}
}
}else {
ActCategory actCategory = new ActCategory();
actCategory.setTitle("授权流程");
actCategory.setTenantId(user.getTenantId());
actCategory = actTaskController.getActCategoryService().getByTitleAndTenantId(actCategory);
actProcess.setCategoryId(actCategory.getId());
}
}
}
package com.bdyh.activiti.Pattern.businesstype;
import com.bdyh.activiti.controller.ActTaskController;
import com.bdyh.activiti.service.ActCategoryService;
import com.bdyh.common.activiti.entity.ActCategory;
import com.bdyh.common.activiti.entity.ActProcess;
import com.bdyh.common.activiti.vo.TaskAndHistoryVo;
import com.bdyh.common.common.sys.User;
import com.bdyh.common.institution.vo.InstitutionDetailVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* @description:
* @author: 田培融
* @date: 2019-08-09 10:32
*/
public class InstitutionResponsibility extends AbstractResponsibilityBusiness {
public InstitutionResponsibility(String businessType) {
this.businessType = businessType;
}
@Override
protected void handler( ActProcess actProcess, User user, List<TaskAndHistoryVo> list , ActTaskController actTaskController) {
if (CollectionUtils.isNotEmpty(list)){
for (TaskAndHistoryVo taskAndHistoryVo : list) {
String institutionId = taskAndHistoryVo.getTableId();
InstitutionDetailVO result = actTaskController.getInstitutionDraftClient().findDetailById(institutionId).getResult();
if (!ObjectUtils.isEmpty(result)){
taskAndHistoryVo.setInstitutionNumber(result.getNumber());
taskAndHistoryVo.setInstitutionNature(result.getNatureName());
}
}
}else {
ActCategory actCategory = new ActCategory();
actCategory.setTitle("制度流程");
actCategory.setTenantId(user.getTenantId());
actCategory = actTaskController.getActCategoryService().getByTitleAndTenantId(actCategory);
actProcess.setCategoryId(actCategory.getId());
}
}
}
在客户端调用
AbstractResponsibilityBusiness contractResponsibility = new ContractResponsibility(CommonConstant.BUSINESS_TYPE_CONTRACT);
AbstractResponsibilityBusiness institutionResponsibility = new InstitutionResponsibility(CommonConstant.BUSINESS_TYPE_INSTITUTION);
AbstractResponsibilityBusiness delegationResponsibility = new DelegationResponsibility(CommonConstant.BUSINESS_TYPE_DELEGATION);
contractResponsibility.setNextBusiness(institutionResponsibility);
institutionResponsibility.setNextBusiness(delegationResponsibility);
contractResponsibility.doHandler(searchVo.getBusinessType(),actProcess,user,thlist,this);
参考:https://www.cnblogs.com/Java-Starter/p/9609835.html
https://www.cnblogs.com/fan-yuan/p/7989377.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类