說明:
有幾個物件都能處理某種請求,但處理的能範圍(權限)不同,
當這個物件沒有處理的權限時,能夠將這個請求,傳遞給下一個物件繼續處理。
範例:
員工請事假,經理只能批准2天的事假,協理只能批准5天的事假,超過五天須由總經理批准。
希望達成如下的效果
static void Main(string[] args) { // 管理者初始化 Manager a1 = new Manager("阿福"); // 經理 Director a2 = new Director("技安"); // 協理 GeneralManager a3 = new GeneralManager("宜靜"); // 總經理 a1.SetUpManager(a2); // 設定經理的上級為協理 a2.SetUpManager(a3); // 設定協理的上級為總經理 // 假單初始化 LeaveRequest leaveRequest = new LeaveRequest(); // 假單 leaveRequest.Name = "大雄"; // 員工姓名 leaveRequest.DayNum = 1; // 請假天數 a1.RequestPersonalLeave(leaveRequest);// 送出1天的假單 leaveRequest.DayNum = 3; // 請假天數 a1.RequestPersonalLeave(leaveRequest);// 送出3天的假單 leaveRequest.DayNum = 7; // 請假天數 a1.RequestPersonalLeave(leaveRequest);// 送出7天的假單 leaveRequest.DayNum = 10; // 請假天數 a1.RequestPersonalLeave(leaveRequest);// 送出10天的假單 Console.Read(); }執行結果:
經理 阿福 已批准 大雄1天的事假 協理 技安 已批准 大雄3天的事假 總經理 宜靜 已批准 大雄7天的事假 總經理 宜靜 要再了解 大雄10天的事假原因
實現重點在於,負責處理的物件,要能設定當自己沒辦法處理時,要將請求丟給誰。
並判斷,遇到不能處理的請求時,繼續將請求傳遞給下一個負責處理的物件。
其餘程式碼
// 管理者處理事假申請的抽象類別 abstract class ManagerHandler { protected string name; protected ManagerHandler upManager; // 上一級的管理者 public ManagerHandler(string name) { this.name = name; } // 設定上一級的管理者 public void SetUpManager(ManagerHandler upManager) { this.upManager = upManager; } // 事假處理 abstract public void RequestPersonalLeave(LeaveRequest leaveRequest); } // 經理 class Manager : ManagerHandler { public Manager(string name) : base(name) { } public override void RequestPersonalLeave(LeaveRequest leaveRequest) { if (leaveRequest.DayNum <= 2) { // 2天以內,經理可以批准 Console.WriteLine("經理 {0} 已批准 {1}{2}天的事假", this.name, leaveRequest.Name, leaveRequest.DayNum); } else { // 超過2天,轉呈上級 if (null != upManager) { upManager.RequestPersonalLeave(leaveRequest); } } } } // 協理 class Director : ManagerHandler { public Director(string name) : base(name) { } public override void RequestPersonalLeave(LeaveRequest leaveRequest) { if (leaveRequest.DayNum <= 5) { // 5天以內,經理可以批准 Console.WriteLine("協理 {0} 已批准 {1}{2}天的事假", this.name, leaveRequest.Name, leaveRequest.DayNum); } else { // 超過5天,轉呈上級 if (null != upManager) { upManager.RequestPersonalLeave(leaveRequest); } } } } // 總經理 class GeneralManager : ManagerHandler { public GeneralManager(string name) : base(name) { } public override void RequestPersonalLeave(LeaveRequest leaveRequest) { if (leaveRequest.DayNum <= 7) { // 7天以內,總經理批准 Console.WriteLine("總經理 {0} 已批准 {1}{2}天的事假", this.name, leaveRequest.Name, leaveRequest.DayNum); } else { // 超過7天以上,再深入了解原因 Console.WriteLine("總經理 {0} 要再了解 {1}{2}天的事假原因", this.name, leaveRequest.Name, leaveRequest.DayNum); } } } // 假單 class LeaveRequest { // 姓名 private string name; public string Name { get { return name; } set { name = value; } } // 天數 private int dayNum; public int DayNum { get { return dayNum; } set { dayNum = value; } } }
相關連結:設計模式整理列表
沒有留言:
張貼留言