@Getter @AllArgsConstructor public class ApprovalRequest { private final String applicant; private final String purpose; private final long amount; }
class ApprovalResult { private final boolean handled; private final String message;
public ApprovalResult(boolean handled, String message) { this.handled = handled; this.message = message; }
public boolean isHandled() { return handled; }
public String getMessage() { return message; }
public static ApprovalResult pass(String info) { return new ApprovalResult(false, info); }
public static ApprovalResult stop(String info) { return new ApprovalResult(true, info); } }
interface ApprovalHandler {
void setNext(ApprovalHandler next);
ApprovalResult handle(ApprovalRequest request); }
abstract class AbstractApprovalHandler implements ApprovalHandler { protected ApprovalHandler next;
@Override public void setNext(ApprovalHandler next) { this.next = next; }
@Override public ApprovalResult handle(ApprovalRequest request) { ApprovalResult result = doHandle(request); if (result.isHandled()) { return result; } if (next != null) { return next.handle(request); } return ApprovalResult.stop("无人处理:审批请求未被任何角色接管"); }
protected abstract ApprovalResult doHandle(ApprovalRequest request); }
class TeamLeadHandler extends AbstractApprovalHandler { private static final long LIMIT = 1000 * 100L;
@Override protected ApprovalResult doHandle(ApprovalRequest request) { if (request.getAmount() <= LIMIT) { return ApprovalResult.stop("组长已审批通过(≤1000元):申请人=" + request.getApplicant()); } return ApprovalResult.pass("组长权限不足,传递给上级"); } }
class ManagerHandler extends AbstractApprovalHandler { private static final long LIMIT = 10000 * 100L;
@Override protected ApprovalResult doHandle(ApprovalRequest request) { if (request.getAmount() <= LIMIT) { return ApprovalResult.stop("经理已审批通过(≤1万元):用途=" + request.getPurpose()); } return ApprovalResult.pass("经理权限不足,传递给上级"); } }
class DirectorHandler extends AbstractApprovalHandler {
@Override protected ApprovalResult doHandle(ApprovalRequest request) { return ApprovalResult.stop("总监已审批通过(链尾兜底):金额=" + (request.getAmount() / 100.0) + "元"); } }
class ApprovalChainBuilder {
public static ApprovalHandler standardChain() { ApprovalHandler teamLead = new TeamLeadHandler(); ApprovalHandler manager = new ManagerHandler(); ApprovalHandler director = new DirectorHandler(); teamLead.setNext(manager); manager.setNext(director); return teamLead; }
public static ApprovalHandler chainOf(ApprovalHandler... handlers) { if (handlers == null || handlers.length == 0) { throw new IllegalArgumentException("handlers 不能为空"); } for (int i = 0; i < handlers.length - 1; i++) { handlers[i].setNext(handlers[i + 1]); } return handlers[0]; } }
public class ChainDemo {
public static void main(String[] args) { ApprovalHandler chain = ApprovalChainBuilder.standardChain();
ApprovalRequest r1 = new ApprovalRequest("Alice", "购买开发工具", 500 * 100L); ApprovalRequest r2 = new ApprovalRequest("Bob", "团队团建", 5000 * 100L); ApprovalRequest r3 = new ApprovalRequest("Carol", "大型设备采购", 120000 * 100L);
System.out.println(chain.handle(r1).getMessage()); System.out.println(chain.handle(r2).getMessage()); System.out.println(chain.handle(r3).getMessage()); }
public static void demoCalls(ApprovalHandler lead, ApprovalHandler manager, ApprovalHandler director) { ApprovalHandler chain1 = chainOf(lead, manager, director);
ApprovalHandler chain2 = chainOf(new ApprovalHandler[]{lead, manager, director});
ApprovalHandler chain3 = chainOf(lead);
} }
|