Java實現責任鏈模式

來源:互聯網
上載者:User

標籤:

責任鏈模式:

將接受者對象連成一條鏈,並在該鏈上傳遞請求,直到一個幾首這對象處理它。通過讓更多個物件有機會處理請求,避免了請求寄件者和接受者之間的耦合。

 

責任鏈模式的優缺點:

優點:高內聚,低耦合。業務變更,新增一級處理時,只需要新增一個類即可。符合我們開閉原則(擴充開發,變更關閉)。

缺點:時間,記憶體的效果相對較大。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實現責任鏈模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.