1、模式的结构
责任链模式包含以下几部分
1)抽象类:抽象类定义了一个公共执行接口,以及后续执行对象
2)具体处理类:实现抽象类,并重写了公共执行接口,定义后续执行对象执行公共执行接口的条件及场景
3)客户端:创建处理链,并定义了处理类处理的顺序,不关心具体处理过程及业务逻辑
责任链的实现代码如下:
抽象类:
package com.example.demo.service;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* 流程操作抽象类
*/
@Data
@Slf4j
public abstract class ProcessWorker {
protected static final String TAG = ProcessWorker.class.getSimpleName();
private ProcessWorker next;
public final void handleRequest(ProcessRequest request) {
if (getHandleLevel() == request.getRequestLevel()) {
operateProcess(request);
} else {
if (next != null) {
next.operateProcess(request);
} else {
//当所有处理者对象均不能处理该请求时输出
log.info(TAG, "All of handler can not handle the request");
}
}
}
protected abstract int getHandleLevel();
protected abstract void operateProcess(ProcessRequest request);
}
抽象请求类:
package com.example.demo.service;
import lombok.Data;
@Data
public abstract class ProcessRequest {
private Object object;
public abstract int getRequestLevel();
}
实现类:
package com.example.demo.service.impl;
import com.example.demo.service.ProcessRequest;
import com.example.demo.service.ProcessWorker;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 管理者岗
*/
@Service
@Slf4j
public class ManagerWorker extends ProcessWorker {
@Override
protected int getHandleLevel() {
return 1;
}
@Override
public void operateProcess(ProcessRequest request) {
log.info(TAG, "Handler1 handler request:"+request.getRequestLevel());
}
}
package com.example.demo.service.impl;
import com.example.demo.service.ProcessRequest;
import com.example.demo.service.ProcessWorker;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 操作者岗
*/
@Service
@Slf4j
public class OperatorWorker extends ProcessWorker {
@Override
protected int getHandleLevel() {
return 2;
}
@Override
public void operateProcess(ProcessRequest request) {
log.info(TAG, "Handler2 handler request:"+request.getRequestLevel());
}
}
参数类:
package com.example.demo.service;
public class Request1 extends ProcessRequest{
@Override
public int getRequestLevel() {
return 1;
}
public Request1(Object object) {
super(object);
}
@Override
public Object getContent() {
return super.getContent();
}
}
package com.example.demo.service;
public class Request2 extends ProcessRequest{
@Override
public int getRequestLevel() {
return 2;
}
public Request2(Object object) {
super(object);
}
@Override
public Object getContent() {
return super.getContent();
}
}
客户端调用:
package com.example.demo.service;
import com.example.demo.service.impl.ManagerWorker;
import com.example.demo.service.impl.OperatorWorker;
public class TestProcess {
public static void main(String[] args) {
ProcessWorker handler1 = new ManagerWorker();
ProcessWorker handler2 = new OperatorWorker();
handler1.setNext(handler2);
//构造三个请求者对象
ProcessRequest request1 = new Request1("Request1");
ProcessRequest request2 = new Request2("Request2");
//总是从链式的首端发起请求
handler1.handleRequest(request1);
handler1.handleRequest(request2);
}
}
3、模式总结
责任链模式的核心在于:1、处理当前请求2、将请求转发至下一个节点