- 使多個物件都有機會處理請求,從而避免的發送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。
![]() |
基本架構圖 |
![]() |
實例架構圖 |
基本程式碼
using System; namespace DPExample { abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest (int request); } class ConcreteHandler1 : Handler { public override void HandleRequest (int request) { if (request >= 0 && request < 10) { Console.WriteLine ("{0} 處理請求 {1}", this.GetType ().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } class ConcreteHandler2 : Handler { public override void HandleRequest (int request) { if (request >= 10 && request < 20) { Console.WriteLine ("{0} 處理請求 {1}", this.GetType ().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } class ConcreteHandler3 : Handler { public override void HandleRequest (int request) { if (request >= 20 && request < 30) { Console.WriteLine ("{0} 處理請求 {1}", this.GetType ().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } }
using System; namespace DPExample { public class Program { static void Main () { Handler h1 = new ConcreteHandler1 (); Handler h2 = new ConcreteHandler2 (); Handler h3 = new ConcreteHandler3 (); h1.SetSuccessor (h2); h2.SetSuccessor (h3); int[] requests = {2,5,14,22,18,3,27,20}; foreach (int request in requests) { h1.HandleRequest(request); } } } }
實例程式碼
using System; namespace DPExample { class 申請 { private string requestType; public string 申請類別 { get { return requestType; } set { requestType = value; } } private string requestContent; public string 申請內容 { get { return requestContent; } set { requestContent = value; } } private int number; public int 數量 { get { return number; } set { number = value; } } } abstract class 管理者 { protected string name; protected 管理者 superior; public 管理者(string name) { this.name = name; } public void 設定上級管理者(管理者 superior) { this.superior = superior; } abstract public void 處理請求(申請 request); } class 經理 : 管理者 { public 經理 (string name) : base(name) { } public override void 處理請求 (申請 request) { if (request.申請類別 == "請假" && request.數量 <= 2) Console.WriteLine ("{0}:{1} 數量{2} 被批准", name, request.申請內容, request.數量); else { if (superior != null) superior.處理請求(request); } } } class 總監 : 管理者 { public 總監 (string name) : base(name) { } public override void 處理請求 (申請 request) { if (request.申請類別 == "請假" && request.數量 <= 5) Console.WriteLine ("{0}:{1} 數量{2} 被批准", name, request.申請內容, request.數量); else { if (superior != null) superior.處理請求(request); } } } class 總經理 : 管理者 { public 總經理 (string name) : base(name) { } public override void 處理請求 (申請 request) { if (request.申請類別 == "請假") Console.WriteLine ("{0}:{1} 數量{2} 被批准", name, request.申請內容, request.數量); else if (request.申請類別 == "加薪" && request.數量 <= 500) Console.WriteLine("{0}:{1} 數量{2} 被批准", name, request.申請內容, request.數量); else if (request.申請類別 == "加薪" && request.數量 > 500) Console.WriteLine("{0}:{1} 數量{2} 再說吧", name, request.申請內容, request.數量); } } }
using System; namespace DPExample { public class Program { static void Main () { 經理 jinli = new 經理("金利"); 總監 zongjian = new 總監("宗劍"); 總經理 zhongjingli = new 總經理("鐘精勵"); jinli.設定上級管理者(zongjian); zongjian.設定上級管理者(zhongjingli); 申請 request = new 申請(); request.申請類別 = "請假"; request.申請內容 = "小菜請假"; request.數量 = 1; jinli.處理請求(request); 申請 request2 = new 申請(); request2.申請類別 = "請假"; request2.申請內容 = "小菜請假"; request2.數量 = 4; jinli.處理請求(request2); 申請 request3 = new 申請(); request3.申請類別 = "加薪"; request3.申請內容 = "小菜請求加薪"; request3.數量 = 500; jinli.處理請求(request3); 申請 request4 = new 申請(); request4.申請類別 = "加薪"; request4.申請內容 = "小菜請求加薪"; request4.數量 = 1000; jinli.處理請求(request4); } } }
留言
張貼留言