Hi,本篇主要是介绍责任链的设计模式原理及场景。
一、设计模式
设计模式是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。它不是语法,而是在特定的场景下提供开发者通用的更简洁的实现。1995年共收录23种设计,责任链便是其一,本篇仅介绍该模式的原理、场景、实现思路。
二、责任链是什么?
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
场景:换句话说,我们假设一家互联网x公司有前台接待、市场部、商务部、人事部、技术部、运营部、财务部等等部门,此时前台接待收到一个合同邮件包裹,包裹未注明归属于哪个部门(假设属于技术部)。那么接待需要找到该包裹主人需要一个一个部门去问,于是先去市场部问,市场部:不是我部的;又去商务部问,商务部:不是我部的;又去人事部问,人事部:不是我部的,又去技术部问,技术部:是我部的!前台接待终于找到包裹归属了,万分激动,不用继续跑腿了,可以继续回前台玩手机了。到此处程序也就结束了,也不会往下继续找部门了,否者会一直找 直到明确该包裹是属于某部门或者包裹发错公司了为止。
三、上代码
综上所述,我们开始上代码。
1.前台接待ChainHandler
public class ChainHandler {
/** 组织架构 */
private static List<BaseService> handlers = new ArrayList<>();
/** 部门总数 */
private int index = 0;
/**
* 装载公司组织架构(部门)
*/
static {
BaseService hr = new HRServiceImpl();
BaseService db = new DBServiceImpl();
BaseService md = new MDServiceImpl();
BaseService it = new ITServiceImpl();
BaseService od = new ODServiceImpl();
BaseService fd = new FDServiceImpl();
new ChainHandler().addChainHandler(hr).addChainHandler(db).addChainHandler(md)
.addChainHandler(it).addChainHandler(od).addChainHandler(fd);
}
public ChainHandler addChainHandler(BaseService baseService) {
handlers.add(baseService);
return this;
}
public ChainHandler addChainHandlers(List<BaseService> baseServices) {
handlers.addAll(baseServices);
return this;
}
/**
* 找到包裹归属逻辑
* @param params
* @return
*/
public String next(ChainBo params) {
if(index == handlers.size()) {
return null;
}
BaseService baseService = handlers.get(index);
index++;
String res = baseService.execute(params, this);
if(ObjectUtil.isNull(res)) {
return "未知包裹";
}
return res;
}
}
2.组织架构BaseService,落实到部门DBServiceImpl、FDServiceImpl、HRServiceImpl、ITServiceImpl、MDServiceImpl、ODServiceImpl
public interface BaseService {
String execute(ChainBo params, ChainHandler chainHandler);
}
public class DBServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("db".equals(params.getType())) {
return "是商务部的";
}
return chainHandler.next(params);
}
}
public class FDServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("fd".equals(params.getType())) {
return "是财务部的";
}
return chainHandler.next(params);
}
}
public class HRServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("hr".equals(params.getType())) {
return "是人事部的";
}
return chainHandler.next(params);
}
}
public class ITServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("it".equals(params.getType())) {
return "是技术部的";
}
return chainHandler.next(params);
}
}
public class MDServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("mkt".equals(params.getType())) {
return "是市场部的";
}
return chainHandler.next(params);
}
}
public class ODServiceImpl implements BaseService {
@Override
public String execute(ChainBo params, ChainHandler chainHandler) {
if("od".equals(params.getType())) {
return "是运营部的";
}
return chainHandler.next(params);
}
}
public class ChainBo {
private String type;
public ChainBo() {
}
public ChainBo(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
3.测试结果
四、扩展(引入springboot,自动装载bean,接口案例)
未完待续...