有人能够提供一份责任链模式的简单解释吗?我发现维基百科上的文章有点令人困惑。
检查用户是否已通过身份验证的过滤器。如果是,则过滤器会传播到下一个过滤器
下一个过滤器检查用户是否对当前资源具有权限。如果是,则传播到下一个
下一个记录当前请求URL和用户名,并始终传播到下一个
链中没有其他内容,因此最终调用目标对象
我将通过一个类比来解释:
把被处理的命令想象成一枚曲棍球,而责任链处理程序类就像是只有一个孔的网。现在想象一下,这些孔的半径不同的网被叠放在一起(最小半径的网在上面)。
现在你从上面扔下曲棍球。如果曲棍球的半径大于第一个孔的半径,它就会被卡住,不会掉落到更低的位置。这意味着第一个处理程序已经处理了该命令。
但如果曲棍球的半径小于孔的半径,它将穿过孔,进入下一个孔,以此类推,直到被卡住或掉落到所有的网中。所有曲棍球穿过的网(责任链处理程序类)都已经处理了该曲棍球(处理了该命令)。
理解编程最好的方法是分析一个简单的例子。这就是它:
该程序将一个单词从英语翻译成其他语言(非常简化版 :)) 翻译后的单词传递给后续的字典;字典形成一个链。
using System;
// The 'Handler' abstract class
abstract class Handler
{
//chain link
private Handler _successor;
//
static private Handler _first;
public Handler Successor
{
set
{
_successor = value;
}
get
{
return _successor;
}
}
public Handler First
{
set
{
_first = value;
}
get
{
return _first;
}
}
//
public void HandleRequest(string request)
{
if (First == this)
{
Console.WriteLine("\n\tWe translate word => \"{0}\"\n", request);
First.Translator(request);
}
//
if (Successor != null)
{
//Translation by the successor's dictionary
Successor.Translator(request);
//Transfer of word (request) to another chain (dictionary)
Successor.HandleRequest(request);
}
}
//
abstract public void Translator(string word);
}
//The concrete class
class GermanDictionary : Handler
{
override public void Translator(string word)
{
switch (word)
{
case "Job":
word = "Arbeit";
break;
case "Rest":
word = "Rest";
break;
}
Console.WriteLine("\t\tinto German => \"{0}\"", word);
}
}
class FrenchDictionary : Handler
{
override public void Translator(string word)
{
switch (word)
{
case "Job":
word = "Travail";
break;
case "Rest":
word = "Reste";
break;
}
Console.WriteLine("\t\tinto French => \"{0}\"", word);
}
}
class PolishDictionary : Handler
{
override public void Translator(string word)
{
switch (word)
{
case "Job":
word = "Praca";
break;
case "Rest":
word = "Odpoczynek";
break;
}
Console.WriteLine("\t\tinto Polish => \"{0}\"", word);
}
}
////
class Client
{
static void Main()
{
Handler h1 = new FrenchDictionary();
Handler h2 = new GermanDictionary();
Handler h3 = new PolishDictionary();
//Determining the consequences in the chain
h1.First=h1;
h1.Successor=h2;
h2.Successor=h3;
h3.Successor=null;
//The word that is translated
string request = "Job";
//Starting the recursive method.
h1.HandleRequest(request) ;
//Another word is translated.
request = "Rest";
h1.HandleRequest(request);
Console.ReadKey();
}
}
/*output:
We translate word => "Job"
into French => "Travail"
into German => "Arbeit"
into Polish => "Praca"
We translate word => "Rest"
into French => "Reste"
into German => "Rest"
into Polish => "Odpoczynek"
*/
您可以在此处找到使用Lambda函数实现责任链模式的示例实现责任链 - Lambda函数实现。
它涵盖了通过不同角色(经理、董事、总裁、销售员)处理采购请求的功能。