JAVA設計模式《一》

來源:互聯網
上載者:User

標籤:

  設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編製真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

  本篇將為大家介紹JAVA中的設計模式的第一種:責任鏈模式。

  什麼是責任鏈模式呢?舉一個例子:由於目前的樓價持續上漲,我們這群小青年,經過無數年打拚,總算攢夠了買房的錢,於是乎你高高興興的來到售房處,準備買一套3居室,這是一位售樓小姐走過了問:先生你需要買房嗎?你很高興的對她說是的。經過精挑細選,你看中了一套,這是你對售樓小姐說,你能給我個5%的折扣嗎?給的話立馬全款。這是售樓小姐一想5%的折扣在我的決定權之內,於是乎她很高興的說:好的先生,那您付款吧。第二天又來了一個買房的人,這個人呢?是個鑽石王老五,他呢對售樓小姐說:給我10%的折扣我就買3套。售樓小姐一想,10%的折扣超出了我的許可權範圍,於是他就對王老五說:先生請稍等,我請示一下我們的經理。然後售樓小姐就找經理去了,把情況都報告給了經理,經理一想,10%的許可權我有,於是對售樓小姐說可以。然後售樓小姐就回來對王老五說:先生我們經理已經同意給你10%的折扣,你到這邊付一下款吧。講到這裡大家是不是已經對責任鏈有了一定的認識呢?下面我們就用代碼具體實現一下這個過程。

 1、建立處理折扣處理人對象:

/** * @價格處理人,負責處理客戶的折扣申請 */public abstract class PriceHandler {    //直接後繼,用於傳遞請求    protected  PriceHandler successor;        public void setSuccessor(PriceHandler successor){        this.successor = successor;    }        //處理折扣申請    public abstract void processDiscount(float discount);}

 2、建立一個銷售類對象:

/* * 銷售,可以批准5%以內的折扣 */public class Sales extends PriceHandler {    public void processDiscount(float discount) {        if(discount<=0.05){            System.out.println("銷售批准");            //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            successor.processDiscount(discount);        }    }}

 3、建立一個銷售經理對象:

/* * 銷售經理,可以批准30%以內的折扣 */public class Manager extends PriceHandler {    public void processDiscount(float discount) {        if(discount<=0.3){            System.out.println("銷售經理批准");            //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            successor.processDiscount(discount);        }    }}

 4、建立一個銷售副總裁對象:

/* * 銷售副總裁,可以批准50%以內的折扣 */public class Director extends PriceHandler {    public void processDiscount(float discount) {        if(discount<=0.5){            System.out.println("銷售副總裁批准");            //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            successor.processDiscount(discount);        }    }}

 5、建立一個銷售總監對象:

/* * 銷售總監,可以批准40%以內的折扣 */public class VicePresident extends PriceHandler {    public void processDiscount(float discount) {        if(discount<=0.4){            System.out.println("銷售總監批准");            //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            successor.processDiscount(discount);        }    }}

 6、建立一個CEO對象:

/* * 總裁,可以批准55%以內的折扣 */public class CEO extends PriceHandler {    public void processDiscount(float discount) {        if(discount<=0.55){            System.out.println("總裁批准");            //System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            System.out.println("總裁拒絕批准");            //System.out.format("%s拒絕了折扣:%.2f%n", this.getClass().getName(), discount);        }    }}

 7、建立PriceHandler的Factory 方法:

public class PriceHandlerFactory {    //建立PriceHandler的Factory 方法    public static PriceHandler createPriceHandler() {                PriceHandler sales = new Sales();        PriceHandler man = new Manager();        PriceHandler dir = new Director();        PriceHandler vp = new VicePresident();        PriceHandler ceo = new CEO();                sales.setSuccessor(man);        man.setSuccessor(dir);        dir.setSuccessor(vp);        vp.setSuccessor(ceo);                return sales;    }}

 8、編寫我們的測試類別:  

/* * 客戶,請求折扣 */public class Customer {        private static 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<=100; i++){            System.out.print(i+":");            customer.requestDiscount(random.nextFloat());        }    }    }

 9、代碼運行測試:

 

 10、添加銷售小組長對象:

/* * 銷售小組長擁有15%的批准許可權 */public class Group extends PriceHandler {    public void processDiscount(float discount) {        if(discount < 0.15){            System.out.println("銷售小組長長批准");        }else{            successor.processDiscount(discount);        }    }}

 11、把小組長添加到責任鏈中:

public class PriceHandlerFactory {    //建立PriceHandler的Factory 方法    public static PriceHandler createPriceHandler() {                PriceHandler sales = new Sales();                //建立銷售小組長對象        PriceHandler group = new Group();                PriceHandler man = new Manager();        PriceHandler dir = new Director();        PriceHandler vp = new VicePresident();        PriceHandler ceo = new CEO();                sales.setSuccessor(group);                //把銷售小組長添加到責任鏈當中        group.setSuccessor(man);                man.setSuccessor(dir);        dir.setSuccessor(vp);        vp.setSuccessor(ceo);                return sales;    }}

 12、代碼測試:

  

  對於責任鏈模式,就為大家介紹完畢。下一篇:單例模式與模板方法模式

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.