為了讓採購單的審批流程更加靈活,並實現採購單的鏈式傳遞和處理,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系統中的採購單審批,主任 副董事長 董事長和董事會都可以處理採購單,他們可以構成一條處理採購單的鏈式結構,採購單沿著這條鏈進行傳遞,這條鏈就稱為職責鏈。職責鏈可以是一條直線 乙個環或者乙個樹形結構,最常見的職責鏈是直線型,即沿著...
請求的鏈式處理 職責鏈模式(一)
一對二 過 過 這聲音熟悉嗎?你會想到什麼?對!紙牌。在類似 鬥地主 這樣的紙牌遊戲中,某人出牌給他的下家,下家看看手中的牌,如果要不起上家的牌則將出牌請求再 給他的下家,其下家再進行判斷。乙個迴圈下來,如果其他人都要不起該牌,則最初的出牌者可以打出新的牌。在這個過程中,牌作為乙個請求沿著一條鏈在傳...