標籤:
設計模式(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設計模式《一》