/** * 抽象处理类 */ 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