前言
责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。
需要处理对象的实体类:
@Data
@Builder
public class FileEntity {
private String name;
private FileType fileType;
private String path;
}
处理对象的类型:
public enum FileType {
/**
* 文件类型
*/
PNG,AVI,MP4
}
定义处理对象的模板:
@Setter
public abstract class AbstractHandle<T> {
private AbstractHandle<T> nextHandle;
/**
* 确认是否处理
* @param t 待处理对象
* @return true false
*/
protected abstract boolean preHandle(T t);
/**
* 能处理就处理
* @param t 处理的对象
*/
protected abstract void onHandle(T t);
public void doHandle(T t) {
if (preHandle(t)) {
onHandle(t);
return;
}
if (nextHandle != null) {
nextHandle.doHandle(t);
return;
}
throw new IllegalStateException("no chain");
}
}
每个对象的处理过程:
public class AviParse extends AbstractHandle<FileEntity>{
@Override
protected boolean preHandle(FileEntity fileEntity) {
return fileEntity.getFileType() == FileType.AVI;
}
@Override
protected void onHandle(FileEntity fileEntity) {
System.out.println("AVIParse.parse , file=" + fileEntity);
}
}
public class Mp4Parse extends AbstractHandle<FileEntity>{
@Override
protected boolean preHandle(FileEntity fileEntity) {
return fileEntity.getFileType() == FileType.MP4;
}
@Override
protected void onHandle(FileEntity fileEntity) {
System.out.println("MP4Parse.parse , file=" + fileEntity);
}
}
public class PngParse extends AbstractHandle<FileEntity>{
@Override
protected boolean preHandle(FileEntity fileEntity) {
return fileEntity.getFileType() == FileType.PNG;
}
@Override
protected void onHandle(FileEntity fileEntity) {
System.out.println("PNGParse.parse , file=" + fileEntity);
}
}
责任链管理器:
public class ChainManager {
private final AbstractHandle<FileEntity> handler;
private ChainManager() {
AviParse aviParse = new AviParse();
Mp4Parse mp4Parse = new Mp4Parse();
PngParse pngParse = new PngParse();
mp4Parse.setNextHandle(aviParse);
aviParse.setNextHandle(pngParse);
handler = mp4Parse;
}
public static class ClassHolder {
public static final ChainManager HOLDER = new ChainManager();
}
public static ChainManager of() {
return ClassHolder.HOLDER;
}
public void parse(FileEntity fileEntity) {
handler.doHandle(fileEntity);
}
}
程序入口示例:
public class App {
public static void main(String[] args) {
FileEntity fileEntity = FileEntity.builder()
.name("test")
.path("/root/file")
.fileType(FileType.PNG)
.build();
ChainManager.of().parse(fileEntity);
}
}
返回结果:
Connected to the target VM, address: '127.0.0.1:56727', transport: 'socket'
PNGParse.parse , file=FileEntity(name=test, fileType=PNG, path=/root/file)
Disconnected from the target VM, address: '127.0.0.1:56727', transport: 'socket'
Process finished with exit code 0