- 使多個物件都有機會處理請求,從而避免的發送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。
![]() |
| 基本架構圖 |
![]() |
| 實例架構圖 |
基本程式碼
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);
}
}
}


留言
張貼留言