设计模式在开发当中是运用特别多的,设计模式就是参照我们日常生活特性,抽象出特性,从而某种实现达到具体要求。当然这当中一定是灵活转变,责任链正式拉开序幕。
我去某某互联网公司去面试,好的方向的流程大致应该是,你上招聘软件投递简历,简历筛选通过,hr邀约面试,面试流程自然是,项目经理,技术总监,老板,Hr行政。大的维度自然是这样,得出结论就有了下面一个图。
你会进行一轮面试,面试的过程类似一个责任的关系链,这个流程必须安装规范规定来,你不能直接去和Hr谈薪资,更不能直接去和老板面试,这就是具体的特性。
你要面试过了项目经理,那你就得去和技术总监面试,技术总监面试过了,你得老板谈一谈,老板要觉得合适,就直接让Hr联系你。基本老板会问你大概的期望。
但是我3轮下来我面试都过了,hr那里面试我却被pass掉了,Hr问了一个问题,你工作六年怎么换了4,5家公司,其实就是内心反问你这小伙子还是太年轻了,其实你内心早就按耐不住,你想说我想跳就跳,我打工赚钱。但是你不能这么说,明明就是要钱的事,但是你却要说得无比的高尚情操。互联网也是内卷得太严重..........
开始正题:
责任链设计模式:通俗易懂地来说,一套流程,一套规范,特定的行为,指定的实现,组合成一个设计模式。
根据以上场景我们得出结论:
抽取公共行为和方法:进行面试,面试结果反馈,下一轮面试,全局的面试记录。
定义抽象hanlder:
package com.xy.design.hanlder;
/**
* <p>
* 抽取公共实现方法,共同行为,面试
* @author xy
* @since 2021-10-21
*/
public abstract class InterviewHanlder {
/**
* 定义一个全局的Hanlder
*/
protected InterviewHanlder interviewHanlder;
/**
* 抽取共同行为的方法,面试
*/
public abstract void getTheInterview();
/**
* 面试结果反馈下一轮面试
* @param nextGatewayHandler
*/
public void setNextGatewayHandler(InterviewHanlder nextGatewayHandler) {
this.interviewHanlder = nextGatewayHandler;
}
/**
* 继续下一轮的面试
*/
protected void nextInterviewFlag() {
if (interviewHanlder != null)
interviewHanlder.getTheInterview();
}
责任流程实现:
第一关项目经理面试实现:
package com.xy.design.hanlder.impl;
import com.xy.design.common.Constants;
import com.xy.design.hanlder.InterviewHanlder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 项目经理面试
* 第一关面试
*/
@Service(Constants.INTERVIEW_PM)
@Component
public class PMHandler extends InterviewHanlder {
@Override
public void getTheInterview() {
System.out.println("项目经理面试--通过----------------");
nextInterviewFlag();
}
}
第二关技术总监面试实现:
package com.xy.design.hanlder.impl;
import com.xy.design.common.Constants;
import com.xy.design.hanlder.InterviewHanlder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 技术总监面试
* 第二关面试
*/
@Service(Constants.INTERVIEW_JS)
@Component
public class TechnologyHandler extends InterviewHanlder {
@Override
public void getTheInterview() {
System.out.println("技术总监面试--通过----------------");
nextInterviewFlag();
}
}
第三关,老板面试实现:
package com.xy.design.hanlder.impl;
import com.xy.design.common.Constants;
import com.xy.design.hanlder.InterviewHanlder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 老板面试
* 第三关面试
*/
@Service(Constants.INTERVIEW_BOOS)
@Component
public class BoosHandler extends InterviewHanlder {
@Override
public void getTheInterview() {
System.out.println("老板面试--通过----------------");
nextInterviewFlag();
}
}
第四关 hr面试实现
package com.xy.design.hanlder.impl;
import com.xy.design.common.Constants;
import com.xy.design.hanlder.InterviewHanlder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* hr面试
* 第四关hr行政面试
*/
@Service(Constants.INTERVIEW_HR)
@Component
public class HrHandler extends InterviewHanlder {
@Override
public void getTheInterview() {
System.out.println("HR谈面试--通过----------------");
}
}
具体实现类:
package com.xy.design.service;
import com.xy.design.common.Constants;
import com.xy.design.hanlder.InterviewHanlder;
import com.xy.design.utils.SpringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 责任链具体实现类
* @author xy
* @since 2021-10-21
*/
@Service
public class interviewHanlderServiceImpl implements InterviewHandlerService {
private InterviewHanlder firstGatewayHandler;
@Override
public InterviewHanlder getHandler() {
//todo 这里最好是写成动态数据库配置 我这里测试使用写死的方式
InterviewHanlder firstInterviewHanlder = SpringUtils.getBean(Constants.INTERVIEW_PM, InterviewHanlder.class);
//根据顺序依次设置责任链执行
List<String> hanlderList = new ArrayList<>();
hanlderList.add(Constants.INTERVIEW_JS);
hanlderList.add(Constants.INTERVIEW_BOOS);
hanlderList.add(Constants.INTERVIEW_HR);
//用一个临时变量接收全局Hanlder
InterviewHanlder temoInterviewHanlder = firstInterviewHanlder;
for (String hanlder : hanlderList) {
//通过代理获取实现类SpringContenxt
InterviewHanlder hanlderImpl = SpringUtils.getBean(hanlder, InterviewHanlder.class);
temoInterviewHanlder.setNextGatewayHandler(hanlderImpl);
}
this.firstGatewayHandler = firstInterviewHanlder;
return firstGatewayHandler;
}
}
公共参数:
/**
* 项目经理标识
*/
public static String INTERVIEW_PM = "pm";
/**
* 技术总监标识
*/
public static String INTERVIEW_JS = "js";
/**
* 老板标识
*/
public static String INTERVIEW_BOOS = "boos";
/**
* Hr标识
*/
public static String INTERVIEW_HR = "hr";
控制器:
package com.xy.design.controller;
import com.xy.design.hanlder.InterviewHanlder;
import com.xy.design.service.InterviewHandlerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HandlerController {
@Autowired
private InterviewHandlerService interviewHandlerService;
@RequestMapping("/interview")
public String interview() {
InterviewHanlder interviewHanlder = interviewHandlerService.getHandler();
interviewHanlder.getTheInterview();
return "面试pass掉了,Hr让我给她钱让我去公司学习技术.......";
}
}
成功了,我们完整的一套完整的责任链就实现了。一关有一关,是不是超级简单。