責任鏈模式是一種很是有用的模式。通常分爲純責任鏈模式,非純責任鏈模式。區別只是前者要麼處理,要麼移交給下一個處理。不存在既處理又交給下一個處理。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); }