請求的鏈式處理 職責鏈模式(三)

2021-06-05 12:08:16 字數 2614 閱讀 8116

為了讓採購單的審批流程更加靈活,並實現採購單的鏈式傳遞和處理,sunny公司開發人員使用職責鏈模式來實現採購單的分級審批,其基本結構如圖16-3所示:

//採購單:請求類

class purchaserequest

public void setamount(double amount)

public double getamount()

public void setnumber(int number)

public int getnumber()

public void setpurpose(string purpose)

public string getpurpose()

}//審批者類:抽象處理者

protected string name; //審批者姓名

this.name = name;

} //設定後繼者

this.successor = successor;

} //抽象請求處理方法

public abstract void processrequest(purchaserequest request);

}//主任類:具體處理者

public director(string name)

//具體請求處理方法

public void processrequest(purchaserequest request)

else

}}//副董事長類:具體處理者

public vicepresident(string name)

//具體請求處理方法

public void processrequest(purchaserequest request)

else

}}//董事長類:具體處理者

public president(string name)

//具體請求處理方法

public void processrequest(purchaserequest request)

else

}}//董事會類:具體處理者

public congress(string name)

//具體請求處理方法

public void processrequest(purchaserequest request)

}

編寫如下客戶端測試**:

class client 

}

編譯並執行程式,輸出結果如下:

主任張無忌審批採購單:10001,金額:45000.0元,採購目的:購買倚天劍。

副董事長楊過審批採購單:10002,金額:60000.0元,採購目的:購買《葵花寶典》。

董事長郭靖審批採購單:10003,金額:160000.0元,採購目的:購買《金剛經》。

召開董事會審批採購單:10004,金額:800000.0元,採購目的:購買桃花島。

//經理類:具體處理者

public manager(string name)

//具體請求處理方法

public void processrequest(purchaserequest request)

else

}}

由於鏈的建立過程由客戶端負責,因此增加新的具體處理者類對原有類庫無任何影響,無須修改已有類的源**,符合「開閉原則」。

在客戶端**中,如果要將新的具體請求處理者應用在系統中,需要建立新的具體處理者物件,然後將該物件加入職責鏈中。如在客戶端測試**中增加如下**:

rhuang = new manager("黃蓉");

將建鏈**改為:

//建立職責鏈

wjzhang.setsuccessor(rhuang); //將「黃蓉」作為「張無忌」的下家

rhuang.setsuccessor(gyang); //將「楊過」作為「黃蓉」的下家

gyang.setsuccessor(jguo);

jguo.setsuccessor(meeting);

重新編譯並執行程式,輸出結果如下:

主任張無忌審批採購單:10001,金額:45000.0元,採購目的:購買倚天劍。

經理黃蓉審批採購單:10002,金額:60000.0元,採購目的:購買《葵花寶典》。

董事長郭靖審批採購單:10003,金額:160000.0元,採購目的:購買《金剛經》。

召開董事會審批採購單:10004,金額:800000.0元,採購目的:購買桃花島。

思考

如果將審批流程由「主任-->副董事長-->董事長-->董事會」調整為「主任-->董事長-->董事會」,系統將做出哪些改動?**修改之後客戶端**的輸出結果。

請求的鏈式處理 職責鏈模式(一)

一對二 過 過 這聲音熟悉嗎?你會想到什麼?對!紙牌。在類似 鬥地主 這樣的紙牌遊戲中,某人出牌給他的下家,下家看看手中的牌,如果要不起上家的牌則將出牌請求再 給他的下家,其下家再進行判斷。乙個迴圈下來,如果其他人都要不起該牌,則最初的出牌者可以打出新的牌。在這個過程中,牌作為乙個請求沿著一條鏈在傳...

請求的鏈式處理 職責鏈模式(二)

很多情況下,在乙個軟體系統中可以處理某個請求的物件不止乙個,例如 scm系統中的採購單審批,主任 副董事長 董事長和董事會都可以處理採購單,他們可以構成一條處理採購單的鏈式結構,採購單沿著這條鏈進行傳遞,這條鏈就稱為職責鏈。職責鏈可以是一條直線 乙個環或者乙個樹形結構,最常見的職責鏈是直線型,即沿著...

請求的鏈式處理 職責鏈模式(一)

一對二 過 過 這聲音熟悉嗎?你會想到什麼?對!紙牌。在類似 鬥地主 這樣的紙牌遊戲中,某人出牌給他的下家,下家看看手中的牌,如果要不起上家的牌則將出牌請求再 給他的下家,其下家再進行判斷。乙個迴圈下來,如果其他人都要不起該牌,則最初的出牌者可以打出新的牌。在這個過程中,牌作為乙個請求沿著一條鏈在傳...