设计模式.责任链模式

51 阅读1分钟

代码


 // 定义抽象处理者
abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Request request) throws BusinessException;
}

// 定义具体处理者
class QuantityHandler extends Handler {
    @Override
    public void handleRequest(Request request) throws BusinessException {
        if (request.getQuantity() > 100) {
            throw new BusinessException("权限数量超过上限");
        }
        if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

class RoleHandler extends Handler {
    @Override
    public void handleRequest(Request request) throws BusinessException {
        if (!"admin".equals(request.getRole())) {
            throw new BusinessException("操作用户权限不是管理员");
        }
        if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

class TypeHandler extends Handler {
    @Override
    public void handleRequest(Request request) throws BusinessException {
        if (!"department".equals(request.getType()) && !"individual".equals(request.getType())) {
            throw new BusinessException("权限类型不是部门或个人权限");
        }
        if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 定义请求
class Request {
    private int quantity;
    private String role;
    private String type;

    // getters and setters
}

// 定义业务异常
class BusinessException extends Exception {
    public BusinessException(String message) {
        super(message);
    }
}

业务中调用责任链

//客户端代码
public class Client {
    public static void main(String[] args) {
        Handler quantityHandler = new QuantityHandler();
        Handler roleHandler = new RoleHandler();
        Handler typeHandler = new TypeHandler();

        quantityHandler.setNextHandler(roleHandler);
        roleHandler.setNextHandler(typeHandler);

        Request request = new Request();
        // set request properties
        try {
            quantityHandler.handleRequest(request);
        } catch (BusinessException e) {
            e.printStackTrace();
        }
    }
}