1. 程式人生 > >java設計模式(五)責任鏈模式

java設計模式(五)責任鏈模式

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設計模式(五)責任鏈模式