/** * 抽象處理類 */ public abstract class Handler { //責任鏈下一個節點 protected Handler successor; /** * 處理請求 */ public abstract void handlerRequest(Integer count); public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } } /** * 實際責任鏈處理器1 */ public class ConcreteHandler1 extends Handler { @Override public void handlerRequest(Integer count) { System.out.println("goto ConcreteHandler1"); if (count <= 0) { System.out.println("ConcreteHandler1 process."); } else if (getSuccessor() != null) { getSuccessor().handlerRequest(count); } } } /** * 實際責任鏈處理器2 */ public class ConcreteHandler2 extends Handler { @Override public void handlerRequest(Integer count) { System.out.println("goto ConcreteHandler2"); if (count > 0) { System.out.println("ConcreteHandler2 process."); } else if (getSuccessor() != null) { getSuccessor().handlerRequest(count); } } }
/** * 測試與應用 */ public class Test { public static void main(String[] args) { //建立責任鏈 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); //組裝 handler1.setSuccessor(handler2); //處理 handler1.handlerRequest(1); } }
goto ConcreteHandler1 goto ConcreteHandler2 ConcreteHandler2 process.
角色介紹html
你去買東西想要申請折扣,每一個level的人只能批准本身範圍內的,批准不了的只能上報給leader.
/** * 價格處理人, 負責處理客戶的責任申請 */ public abstract class PriceHandler { /** * 直接後繼, 用於處理請求 */ protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /** * 處理折扣申請 */ public abstract void processDiscount(float discount); } //下面是責任鏈的各個節點 public class CEO extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.55) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { System.out.format("%s refused: %.2f%n", this.getClass().getName(), discount); } } } public class Director extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.35) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { successor.processDiscount(discount); } } } public class Lead extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.15) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { successor.processDiscount(discount); } } } public class Manager extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.2) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { successor.processDiscount(discount); } } } public class Sales extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.05) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { successor.processDiscount(discount); } } } public class VicePresident extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.45) { System.out.format("%s approved: %.2f%n", this.getClass().getName(), discount); } else { successor.processDiscount(discount); } } } //責任鏈拼裝工廠 public class PriceHandlerFactory { /** * 獲取PriceHandler 對象 * @return PriceHandler */ public static PriceHandler createPriceHandler() { PriceHandler sales = new Sales(); PriceHandler lead = new Lead(); PriceHandler manager = new Manager(); PriceHandler director = new Director(); PriceHandler vp = new VicePresident(); PriceHandler ceo = new CEO(); sales.setSuccessor(lead); lead.setSuccessor(manager); manager.setSuccessor(director); director.setSuccessor(vp); vp.setSuccessor(ceo); return sales; } }
/** * 客戶, 申請折扣 */ public class Customer { private PriceHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler) { this.priceHandler = priceHandler; } public void requestDiscount (float discount) { priceHandler.processDiscount(discount); } public static void main(String[] args) { Customer customer = new Customer(); customer.setPriceHandler(PriceHandlerFactory.createPriceHandler()); Random random = new Random(); for (int i = 0; i < 10; i++) { System.out.print((i + 1) + ":"); customer.requestDiscount(random.nextFloat()); } } }
1:org.ko.cor.demo1.handler.CEO approved: 0.46 2:org.ko.cor.demo1.handler.CEO refused: 0.55 3:org.ko.cor.demo1.handler.CEO refused: 0.61 4:org.ko.cor.demo1.handler.CEO approved: 0.53 5:org.ko.cor.demo1.handler.CEO refused: 0.83 6:org.ko.cor.demo1.handler.CEO refused: 0.72 7:org.ko.cor.demo1.handler.CEO refused: 0.69 8:org.ko.cor.demo1.handler.Director approved: 0.28 9:org.ko.cor.demo1.handler.Lead approved: 0.07 10:org.ko.cor.demo1.handler.CEO refused: 0.93
責任鏈模式和狀態模式java
慕課網設計模式精講
:https://coding.imooc.com/class/270.html 責任鏈模式(職責鏈模式)詳解
:http://c.biancheng.net/view/1383.html 《JAVA與模式》之責任鏈模式
:https://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html