意圖 0 適用性 1 結構 2 實現 3 效果 4 參考 5意圖使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。適用性在以下條件下使用:有多個對象可以處理一個請求,哪個對象處理該請求運行時刻...
意圖
使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
適用性
在以下條件下使用:
- 有多個對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
- 你想在不明確指定接受者的情況下,向多個對象中的一個提交一個請求。
- 可處理一個請求的對象集合應該被動態指定。
結構
實現
實現一個郵件處理系統,將郵件按照類別交給不同的對象處理。
已經分類的郵件
public class Request
{
public Request(string type)
{
Type = type;
}
private string _content;
public string Type { get; set; }
}
處理的抽象,類似鏈表,自身包含指向下一個處理節點的對象
public abstract class Handler
{
protected Handler _nextHandler;
public abstract void ProcessRequest(Request request);
public void SetNext(Handler handler)
{
_nextHandler = handler;
}
}
對不同類型進行處理的對象
//粉絲郵件處理
public class FanHandler:Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type=="fan")
{
Console.WriteLine("fan's email process");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//垃圾郵件處理
public class SpamHandler : Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type == "spam")
{
Console.WriteLine("spam delete");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//抱怨和意見郵件處理
public class ComplaintHandler:Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type=="complaint")
{
Console.WriteLine("complaint process");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//其他郵件處理
public class DefaultHandler:Handler
{
public override void ProcessRequest(Request request)
{
Console.WriteLine("Do some thing!");
}
}
使用之前,先要將責任鏈串聯起來
class Program
{
static void Main(string[] args)
{
//發送者
var fan = new Request("fan");
var spam = new Request("spam");
var complaint = new Request("complaint");
var other = new Request("other");
//接受者
var fanHandler = new FanHandler();
var spamHandler = new SpamHandler();
var complaintHandler = new ComplaintHandler();
var defaultHandler = new DefaultHandler();
//構造責任鏈
fanHandler.SetNext(spamHandler);
spamHandler.SetNext(complaintHandler);
complaintHandler.SetNext(defaultHandler);
//請求交由責任鏈頭節點處理
fanHandler.ProcessRequest(fan);
fanHandler.ProcessRequest(spam);
fanHandler.ProcessRequest(complaint);
fanHandler.ProcessRequest(other);
Console.ReadKey();
}
}
運行結果
效果
- 降低耦合度
- 增強了給對象指派職責的靈活性
- 不保證被接受(用一個預設處理類來解決這個問題)