標籤:
責任鏈模式:
將接受者對象連成一條鏈,並在該鏈上傳遞請求,直到一個幾首這對象處理它。通過讓更多個物件有機會處理請求,避免了請求寄件者和接受者之間的耦合。
責任鏈模式的優缺點:
優點:高內聚,低耦合。業務變更,新增一級處理時,只需要新增一個類即可。符合我們開閉原則(擴充開發,變更關閉)。
缺點:時間,記憶體的效果相對較大。java的AWT對責任鏈模式的拋棄,去擁抱了觀察者模式。
應用:
Java異常處理機制
JavaScript事件模型
JavaEE的Filter攔截器
SpringSecurity Spring安全架構
執行個體:
變更需求
執行個體代碼:
類結構圖
具體代碼:
package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 價格處理人,負責處理客戶折扣申請 */public abstract class PriceHandler { //直接後繼,用於傳遞請求 protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /* * 處理折扣申請 */ public abstract void processDiscount(float discount);}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 銷售,可以批准5%以內的折扣 */public class Sales extends PriceHandler { @Override public void processDiscount(float discount) { if(discount <= 0.05){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 業務擴充,管理需要細分,新增以及銷售層銷售組長 * 銷售小組長,可以批准15%以內的折扣 */public class Lead extends Sales{ @Override public void processDiscount(float discount) { if(discount <= 0.15){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 銷售經理,可以批准30%以內的折扣 */public class Manager extends Lead { @Override public void processDiscount(float discount) { if(discount <= 0.30){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 銷售總監,可以批准40%以內的折扣 */public class Director extends Manager { @Override public void processDiscount(float discount) { if(discount <= 0.40){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 副總,可以批准50%以內的折扣 */public class VicePresident extends Director { @Override public void processDiscount(float discount) { if(discount <= 0.50){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * CEO,可以批准55%以內的折扣,可以拒絕高於55%的折扣 */public class CEO extends Manager { @Override public void processDiscount(float discount) { if(discount <= 0.55){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ System.out.format("%s拒絕了折扣:%2f%n",this.getClass().getName(),discount); } }}package chengxuyuanzhilu.com.cor.handler;/** * @author 公眾號:程式員之路 * 建立價格處理者工廠 */public class PriceHandleFactory { /* * 工程模式建立價格處理者 */ public static PriceHandler createPriceHandler() { //向上轉型 PriceHandler sales = new Sales(); PriceHandler lead = new Lead();//業務變更 PriceHandler manager = new Manager(); PriceHandler director = new Director(); PriceHandler vicePresident = new VicePresident(); PriceHandler ceo = new CEO(); //指定後繼銷售者 sales.setSuccessor(lead); lead.setSuccessor(manager);//業務變更 manager.setSuccessor(director); director.setSuccessor(vicePresident); vicePresident.setSuccessor(ceo); return sales; }}package chengxuyuanzhilu.com.cor;import java.util.Random;import chengxuyuanzhilu.com.cor.handler.PriceHandleFactory;import chengxuyuanzhilu.com.cor.handler.PriceHandler;/** * @author 公眾號:程式員之路 * 客戶,請求折扣 */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(PriceHandleFactory.createPriceHandler()); Random rand = new Random(); for(int i=1;i<100;i++){ System.out.println(i+":"); customer.requestDiscount(rand.nextFloat()); } }}
Java實現責任鏈模式