责任链模式是一种很是有用的模式。通常分为纯责任链模式,非纯责任链模式。区别只是前者要么处理,要么移交给下一个处理。不存在既处理又交给下一个处理。java
责任链原型很是简单,其实就是把能够处理的类串成一个链表,而后依次判断执行或者交给连接的下一个。session
直接上代码:
ide
1、纯的责任链模式:测试
报销你们都遇到过,若是小于1w的由部门经理审核,1W和10W之间由总经理审核,10W及以上由CEO审核。this
1.抽象经理url
public abstract class AbstractManager { private AbstractManager nextPoint; public abstract void check(double money); public AbstractManager getNextPoint() { return nextPoint; } public void setNextPoint(AbstractManager nextPoint) { this.nextPoint = nextPoint; } }
2.CEOspa
public class CEO extends AbstractManager { @Override public void check(double money) { if (money >= 100000) { System.out.println("CEO check the money....."); } else { if (getNextPoint() != null) { getNextPoint().check(money); } } } }
3.部门经理日志
public class DepartmentManager extends AbstractManager { @Override public void check(double money) { if (money < 10000) { System.out.println("DepartmentManager check the money"); } else { if (getNextPoint() != null) { getNextPoint().check(money); } } } }
4.总经理code
public class GeneralManager extends AbstractManager { @Override public void check(double money) { if (money >= 10000 && money < 100000) { System.out.println("General manager check the money ....."); } else { if (getNextPoint() != null) { getNextPoint().check(money); } } } }
5.测试
get
public static void main(String[] args) { AbstractManager ceo = new CEO(); AbstractManager departmentManager = new DepartmentManager(); AbstractManager generalManager = new GeneralManager(); //建立责任链 departmentManager.setNextPoint(generalManager); generalManager.setNextPoint(ceo); //直接交给部门经理处理,其余就不用管啦。 departmentManager.check(999999); }
结果就是
5.1 小于1W的
DepartmentManager check the money
5.2 大于等于1w小于10w的
General manager check the money.....
5.4 大于等于10w的
CEO check the money.....
1、不纯的责任链模式:
1.抽象过滤器
public abstract class Filter { private Filter nextFilter; public abstract void handle(Request request); public Filter getNextFilter() { return nextFilter; } public void setNextFilter(Filter nextFilter) { this.nextFilter = nextFilter; } }
2.日志过滤器
public class LogFilter extends Filter { @Override public void handle(Request request) { if (request.getUrl() != null && request.getUrl().contains("payBill")) { System.out.println("log write payBill"); } if (getNextFilter() != null) { getNextFilter().handle(request); } } }
3.session过滤器
public class SessionFilter extends Filter { @Override public void handle(Request request) { if (request.getSessionId() == null) { System.out.println("session id is none, check the username and password."); System.out.println("username and password check successful"); } else { System.out.println("session id check pass"); } if (getNextFilter() != null) { getNextFilter().handle(request); } } }
4.请求信息
public class Request { private String userName; private String password; private String sessionId; private String content; private String charSet; private String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getCharSet() { return charSet; } public void setCharSet(String charSet) { this.charSet = charSet; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
5.测试代码
public static void main(String[] args) throws UnsupportedEncodingException { Filter charSetFilter = new CharacterFilter(); Filter logFilter = new LogFilter(); Filter sessionFilter = new SessionFilter(); sessionFilter.setNextFilter(logFilter); logFilter.setNextFilter(charSetFilter); Request req = new Request(); req.setContent("今每天气不错"); req.setSessionId("1111"); req.setCharSet("GBK"); req.setUserName("lubby"); req.setPassword("Jack1234565"); req.setUrl("/payBill"); sessionFilter.handle(req); }