意圖
使多個對象都有機會處理請求项滑,從而避免請求的發(fā)送者與接收者之間的耦合關(guān)系枪狂。將這些對象連成一條鏈宋渔,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止严蓖。
結(jié)構(gòu)
職責鏈結(jié)構(gòu)圖
適用性
- 有多個的對象可以處理一個請求氧急,哪個對象處理該請求運行時刻自動確定;
- 你想在不明確指定接收者的情況下毒姨,向多個對象中的一個提交一個請求钾恢;
- 需要動態(tài)地指定可以處理請求的對象集。
優(yōu)缺點
- 該模式使一個對象無需知道其他哪一個對象處理請求泉懦,從而降低耦合;
- 允許運行時刻對該鏈接進行動態(tài)地增/減疹瘦,增強了對象指派職責的靈活性;
- 由于沒有明確的接受者邓嘹,因此不保證請求會被處理险胰;
示例
模擬一個圖形用戶界面的上下文幫助機制,用戶在界面的任意部分上點擊就可以得到幫助信息棚贾。
實現(xiàn)(C#)
職責鏈示例結(jié)構(gòu)圖
using System;
public enum Topic
{
NO_HELP_TOPIC,
HELP_TOPIC
}
public abstract class HelpHandler
{
private HelpHandler successor;
private Topic topic;
protected HelpHandler(HelpHandler successor, Topic topic)
{
this.successor = successor;
this.topic = topic;
}
private bool HasHelp()
{
return this.topic != Topic.NO_HELP_TOPIC;
}
// 模板方法
public void HandleHelp()
{
if(HasHelp())
{
DoHandleHelp();
}
else if(this.successor != null)
{
this.successor.DoHandleHelp();
}
}
protected abstract void DoHandleHelp();
}
public class Application : HelpHandler
{
public Application(HelpHandler successor, Topic topic) : base(successor,topic){}
protected override void DoHandleHelp()
{
Console.WriteLine("「應(yīng)用程序」提供的幫助信息.");
}
}
public class Widget : HelpHandler
{
public Widget(HelpHandler successor, Topic topic) : base(successor, topic) {}
protected override void DoHandleHelp()
{
Console.WriteLine("「窗口小部件」提供的幫助信息.");
}
}
public class Dialog : Widget
{
public Dialog(HelpHandler successor, Topic topic) : base(successor, topic){}
protected override void DoHandleHelp()
{
Console.WriteLine("「對話框」提供的幫助信息.");
}
}
public class Button : Widget
{
public Button(HelpHandler successor, Topic topic) : base(successor,topic){}
protected override void DoHandleHelp()
{
Console.WriteLine("「按鈕控件」提供的幫助信息.");
}
}
public class App
{
public static void Main(string[] args)
{
Application application = new Application(null,Topic.HELP_TOPIC); // 提供幫助
Dialog dialog = new Dialog(application, Topic.HELP_TOPIC); // 提供幫助
Button button = new Button(dialog, Topic.NO_HELP_TOPIC); // 不提供幫助
// 顯示幫助信息
button.HandleHelp();
}
}
// 控制臺輸出:
// 「對話框」提供的幫助信息.