职责链模式(Chain of responsibility)以及servlet中filter的原理
先看经典职责链代码,
(代码来自维基)
package pattern;import java.io.*;abstract class PurchasePower {protected final double base = 500;protected PurchasePower successor;public void setSuccessor(PurchasePower successor) {this.successor = successor;}abstract public void processRequest(PurchaseRequest request);}class ManagerPPower extends PurchasePower {private final double ALLOWABLE = 10 * base;public void processRequest(PurchaseRequest request) {if (request.getAmount() < ALLOWABLE)System.out.println("Manager will approve $" + request.getAmount());else if (successor != null)successor.processRequest(request);}}class DirectorPPower extends PurchasePower {private final double ALLOWABLE = 20 * base;public void processRequest(PurchaseRequest request) {if (request.getAmount() < ALLOWABLE)System.out.println("Director will approve $" + request.getAmount());else if (successor != null)successor.processRequest(request);}}class VicePresidentPPower extends PurchasePower {private final double ALLOWABLE = 40 * base;public void processRequest(PurchaseRequest request) {if (request.getAmount() < ALLOWABLE)System.out.println("Vice President will approve $"+ request.getAmount());else if (successor != null)successor.processRequest(request);}}class PresidentPPower extends PurchasePower {private final double ALLOWABLE = 60 * base;public void processRequest(PurchaseRequest request) {if (request.getAmount() < ALLOWABLE)System.out.println("President will approve $" + request.getAmount());elseSystem.out.println("Your request for $" + request.getAmount()+ " needs a board meeting!");}}class PurchaseRequest {private int number;private double amount;private String purpose;public PurchaseRequest(int number, double amount, String purpose) {this.number = number;this.amount = amount;this.purpose = purpose;}public double getAmount() {return amount;}public void setAmount(double amt) {amount = amt;}public String getPurpose() {return purpose;}public void setPurpose(String reason) {purpose = reason;}public int getNumber() {return number;}public void setNumber(int num) {number = num;}}public class CheckAuthority {public static void main(String[] args) {ManagerPPower manager = new ManagerPPower();DirectorPPower director = new DirectorPPower();VicePresidentPPower vp = new VicePresidentPPower();PresidentPPower president = new PresidentPPower();manager.setSuccessor(director);director.setSuccessor(vp);vp.setSuccessor(president);// enter ctrl+c to kill.try {while (true) {System.out.println("Enter the amount to check who should approve your expenditure.");System.out.print(">");double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine());manager.processRequest(new PurchaseRequest(0, d, "General"));}} catch (Exception e) {System.exit(1);}}}final class ApplicationFilterChain implements FilterChain {private List filterConfigs = new ArrayList();private Iterator iterator = null;public void doFilter(ServletRequest request, ServletResponse response) {if (this.iterator == null)this.iterator = filters.iterator();if (this.iterator.hasNext()) {ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) iterator.next();// 在这里取得下一个filter的配置对象Filter filter = filterConfig.getFilter();// 注意:在这里取得了下一个filter,这个filter就是你实现了filter接口的filter.filter.doFilter(request, response, this);// 把请求传递个下一个filter处理}}public void startFilter() {ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) iterator.next();Filter filter = filterConfig.getFilter();filter.doFilter(request, response, this);}public void addFilterConfig(ApplicationFilterConfig filterConfig) {filterConfigs.add(filterConfig);}}final class ApplicationFilterConfig implements FilterConfig {private Filter filter = null;private String filterClass;public Filter getFilter() {if (this.filter != null)return (this.filter);Class clazz = classLoader.loadClass(filterClass);this.filter = (Filter) clazz.newInstance();return this.filter;}}public class MainTest {public FilterChain create() {ApplicationFilterChain a = new ApplicationFilterChain();List filters = readConfigFile();// 读取配置文件,获取filter信息,实现过程略for (int i = 0; i < filters.size(); i++) {ApplicationFilterConfig afc = (ApplicationFilterConfig) filters.get(i);a.addFilterConfig(afc);}return a;}public static void main(String args[]) {(new MainTest()).create().startFilter();}}