設計模式(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的工廠方法:
public class PriceHandlerFactory { //創建PriceHandler的工廠方法 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的工廠方法 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、代碼測試:

對于責任鏈模式,就為大家介紹完畢。下一篇:單例模式與模板方法模式
新聞熱點
疑難解答