責任鏈模式--Chain of Responsibility Pattern
阿新 • • 發佈:2018-11-15
看到責任鏈模式,想到JAVA web開發中為方便對http請求進行各種處理以責任鏈模式實現的過濾器。
責任鏈模式是一種物件的行為模式。在責任鏈模式裡,很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
簡單例子:
abstract class Handler { private Handler nextHandler; public Handler getNextHandler() { return nextHandler; } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public abstract void doHandler(); } class ConcreteHandler extends Handler { @Override public void doHandler() { if (getNextHandler() != null) { System.out.println("還有責任鏈"); getNextHandler().doHandler(); } else { System.out.println("我自己處理" + toString()); } } }
OA流程請求例子:
abstract class ConsumeHandler { private ConsumeHandler nextHandler; public ConsumeHandler getNextHandler() { return nextHandler; } public void setNextHandler(ConsumeHandler nextHandler) { this.nextHandler = nextHandler; } /** user申請人 free報銷費用 */ public abstract void doHandler(String user, double free); } //專案經理 class ProjectHandler extends ConsumeHandler { @Override public void doHandler(String user, double free) { if (free < 500) { if (user.equals("lwx")) { System.out.println("給予報銷:" + free); } else { System.out.println("報銷不通過"); } } else { if (getNextHandler() != null) { getNextHandler().doHandler(user, free); } } } } //部門經理 class DeptHandler extends ConsumeHandler { @Override public void doHandler(String user, double free) { if (free < 1000) { if (user.equals("zy")) { System.out.println("給予報銷:" + free); } else { System.out.println("報銷不通過"); } } else { if (getNextHandler() != null) { getNextHandler().doHandler(user, free); } } } } //總經理 class GeneralHandler extends ConsumeHandler { @Override public void doHandler(String user, double free) { if (free >=1000) { if (user.equals("lwxzy")) { System.out.println("給予報銷:" + free); } else { System.out.println("報銷不通過"); } } else { if (getNextHandler() != null) { getNextHandler().doHandler(user, free); } } } }
private static class VirtualFilterChain implements FilterChain { private final FilterChain originalChain; private final List<? extends Filter> additionalFilters; private int currentPosition = 0; public VirtualFilterChain(FilterChain chain, List<? extends Filter> additionalFilters) { this.originalChain = chain; this.additionalFilters = additionalFilters; } @Override public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { if (this.currentPosition == this.additionalFilters.size()) { this.originalChain.doFilter(request, response); } else { this.currentPosition++; Filter nextFilter = this.additionalFilters.get(this.currentPosition - 1); nextFilter.doFilter(request, response, this); } } }
FilterChain 樣例中,父類實現執行的策略;其他例子則是在子類中實現策略。