java設計模式(五)責任鏈模式
阿新 • • 發佈:2017-07-20
args 測試 處理 next 設計 ted static rgs stat
很多對象有每個對象對其下家的引用而連接起來形成一條鏈,請求在這條鏈上傳遞,直到鏈上某個對象決定處理此請求,應用場景如單位審批流程等。
要點:1)抽象處理者角色:定義處理請求接口及設定下家引用
2)具體處理著角色:具體處理請求或選擇將請求傳給下家
1、抽象處理者角色類,定義處理請求接口及下家引用
public abstract class PriceHandle { protected PriceHandle successor; public void setSuccessor(PriceHandle successor) { this.successor = successor; } public abstract void process(float discount); public static PriceHandle createPriceHandle() { PriceHandle sales = new Sales(); PriceHandle direct = new Direct(); PriceHandle ceo = new CEO(); sales.setSuccessor(direct); direct.setSuccessor(ceo);return sales; } }
2、具體處理者角色類銷售類
public class Sales extends PriceHandle { public void process(float discount) { if(discount <= 0.1) { System.out.format("%s批準了折扣:%.2f%n",this.getClass().getName(), discount); } else { successor.process(discount); } } }
3、具體處理者角色主管類
public class Direct extends PriceHandle { public void process(float discount) { if(discount <= 0.2) { System.out.format("%s批準了折扣:%.2f%n",this.getClass().getName(), discount); } else { successor.process(discount); } } }
4、具體處理者角色ceo類
public class CEO extends PriceHandle { public void process(float discount) { if(discount <= 0.3) { System.out.format("%s批準了折扣:%.2f%n",this.getClass().getName(), discount); } else { System.out.format("%s拒絕了折扣:%.2f%n",this.getClass().getName(), discount); } } }
5、測試類
public class Model { private PriceHandle priceHandle; public void setPriceHandle(PriceHandle priceHandle) { this.priceHandle = priceHandle; } public void requestDiscount(float discount) { priceHandle.process(discount); } public static void main(String[] args) { Model customer = new Model(); customer.setPriceHandle(PriceHandle.createPriceHandle()); Random random = new Random(); for(int i = 0; i < 100; i++) { System.out.print(i + ":"); customer.requestDiscount(random.nextFloat()); } } }
java設計模式(五)責任鏈模式