public abstract class Handler { /** * 持有後繼的責任對象 */ protected Handler successor; /** * 示意處理請求的方法,雖然這個示意方法是沒有傳入參數的 但實際是能夠傳入參數的,根據具體須要來選擇是否傳遞參數 */ public abstract void handleRequest(); /** * 取值方法 */ public Handler getSuccessor() { return successor; } /** * 賦值方法,設置後繼的責任對象 */ public void setSuccessor(Handler successor) { this.successor = successor; } }
public class ConcreteHandler extends Handler { /** * 處理方法,調用此方法處理請求 */ @Override public void handleRequest() { /** * 判斷是否有後繼的責任對象 若是有,就轉發請求給後繼的責任對象 若是沒有,則處理請求 */ if (getSuccessor() != null) { System.out.println("放過請求"); getSuccessor().handleRequest(); } else { System.out.println("處理請求"); } } }
public class Client { public static void main(String[] args) { // 組裝責任鏈 Handler handler1 = new ConcreteHandler(); Handler handler2 = new ConcreteHandler(); handler1.setSuccessor(handler2); // 提交請求 handler1.handleRequest(); } }
demojava
public abstract class FeeHandler { /** * 持有下一個處理請求的對象 */ protected FeeHandler successor = null; /** * 取值方法 */ public FeeHandler getSuccessor() { return successor; } /** * 設置下一個處理請求的對象 */ public void setSuccessor(FeeHandler successor) { this.successor = successor; } /** * 處理聚餐費用的申請 * * @param user * 申請人 * @param fee * 申請的錢數 * @return 成功或失敗的具體通知 */ public abstract String handleFeeRequest(String user, double fee); } public class ProjectManager extends FeeHandler { @Override public String handleFeeRequest(String user, double fee) { // TODO Auto-generated method stub // TODO Auto-generated method stub String str = ""; // 項目經理權限比較小,只能在500之內 if (fee < 500) { // 爲了測試,簡單點,只贊成張三的請求 if ("張三".equals(user)) { str = "成功:項目經理贊成【" + user + "】的聚餐費用,金額爲" + fee + "元"; } else { // 其餘人一概不一樣意 str = "失敗:項目經理不一樣意【" + user + "】的聚餐費用,金額爲" + fee + "元"; } } else { // 超過500,繼續傳遞給級別更高的人處理 if (getSuccessor() != null) { return getSuccessor().handleFeeRequest(user, fee); } } return str; } } public class DeptManager extends FeeHandler { @Override public String handleFeeRequest(String user, double fee) { String str = ""; // 部門經理的權限只能在1000之內 if (fee < 1000) { // 爲了測試,簡單點,只贊成張三的請求 if ("張三".equals(user)) { str = "成功:部門經理贊成【" + user + "】的聚餐費用,金額爲" + fee + "元"; } else { // 其餘人一概不一樣意 str = "失敗:部門經理不一樣意【" + user + "】的聚餐費用,金額爲" + fee + "元"; } } else { // 超過1000,繼續傳遞給級別更高的人處理 if (getSuccessor() != null) { return getSuccessor().handleFeeRequest(user, fee); } } return str; } } public class GeneralManager extends FeeHandler { @Override public String handleFeeRequest(String user, double fee) { String str = ""; // 總經理的權限很大,只要請求到了這裏,他均可以處理 if (fee >= 1000) { // 爲了測試,簡單點,只贊成張三的請求 if ("張三".equals(user)) { str = "成功:總經理贊成【" + user + "】的聚餐費用,金額爲" + fee + "元"; } else { // 其餘人一概不一樣意 str = "失敗:總經理不一樣意【" + user + "】的聚餐費用,金額爲" + fee + "元"; } } else { // 若是還有後繼的處理對象,繼續傳遞 if (getSuccessor() != null) { return getSuccessor().handleFeeRequest(user, fee); } } return str; } } public class FeeClient { public static void main(String[] args) { // 先要組裝責任鏈 FeeHandler h1 = new GeneralManager(); FeeHandler h2 = new DeptManager(); FeeHandler h3 = new ProjectManager(); h3.setSuccessor(h2); h2.setSuccessor(h1); // 開始測試 String test1 = h3.handleFeeRequest("張三", 300); System.out.println("test1 = " + test1); String test2 = h3.handleFeeRequest("李四", 300); System.out.println("test2 = " + test2); System.out.println("---------------------------------------"); String test3 = h3.handleFeeRequest("張三", 700); System.out.println("test3 = " + test3); String test4 = h3.handleFeeRequest("李四", 700); System.out.println("test4 = " + test4); System.out.println("---------------------------------------"); String test5 = h3.handleFeeRequest("張三", 1500); System.out.println("test5 = " + test5); String test6 = h3.handleFeeRequest("李四", 1500); System.out.println("test6 = " + test6); } }
學習設計模式強烈推薦的博客:java_my_lifegit
代碼地址:lennon設計模式