设计模式之-责任链

前言
责任链模式(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值