设计模式是针对软件设计中常见问题和复杂性的解决方案。 正如我们之前在这里讨论的那样,它们分为三个不同的类别:创造,结构和行为。 责任链设计模式属于行为类别,可用于减少请求的发送者与处理请求的接收者对象之间的耦合。
通过给一个以上的对象一个处理请求的机会,避免将请求的发送者耦合到其接收者。 链接接收对象,并沿着链传递请求,直到对象处理该请求为止。
本质上,在责任链设计模式中,您具有可以处理请求的列表或对象链。 每个对象都可以处理请求,也可以将请求转发给另一个处理程序。 在本文中,我们将讨论责任链设计模式的目的以及如何在C#中实现它。
责任链设计模式
责任链模式的典型实现的参与者包括抽象处理程序,具体处理程序以及客户或使用者。 抽象处理程序是负责定义合同的接口。 具体的处理程序是实现抽象处理程序中定义的操作的组件。 具体的处理程序要么自行处理请求,要么将请求转发给后继者。 最后,客户端组件负责发起请求。
现在让我们探索如何在C#中实现这种设计模式。 假设您已在系统中安装Visual Studio,则可以按照以下步骤在Visual Studio IDE中创建控制台应用程序项目。
- 打开Visual Studio IDE
- 单击文件->新建->项目
- 在“新建项目”对话框窗口中,选择“类库(.Net Framework)”项目模板
- 指定项目的名称和位置,然后单击“确定”保存
创建的控制台应用程序项目将包含一个名为Class1.cs的默认文件。 您可以根据需要重命名此文件或创建一个新文件。 现在让我们深入研究代码。
创建抽象处理程序
考虑下面的抽象基类。
public abstract class HandlerBase
{
protected HandlerBase successor;
public void SetSuccessor(HandlerBase handlerBase)
{
successor = handlerBase;
}
public abstract void ProcessRequest(string request);
}
HandlerBase类包含两个方法-SetSuccessor和ProcessRequest方法。 前者用于设置后继对象以处理请求,而后者是将处理请求的方法。 我们将在下面显示的具体类中实现这些方法。
创建具体处理程序
考虑以下两个具体类。
public class ConcreteHandlerA : HandlerBase
{
public override void ProcessRequest(string request)
{
//Some code
}
}
public class ConcreteHandlerB : HandlerBase
{
public override void ProcessRequest(string request)
{
//Some code
}
}
落实责任链
最后,我们必须建立责任链。 以下代码说明了如何实现。
static void Main(string[] args)
{
string[] codes = { “A001”, “A002”, “A003” };
HandlerBase handlerA = new ConcreteHandlerA();
HandlerBase handlerB = new ConcreteHandlerB();
handlerA.SetSuccessor(handlerB);
handlerB.SetSuccessor(handlerA);
foreach (var s in codes)
{
handlerA.ProcessRequest(s);
}
Console.Read();
}
请参考上面显示的代码清单。 请注意如何创建具体处理程序的实例以及如何委派职责。 (我将留给您以实现适合您需要的ProcessRequest方法。)还要注意如何将字符串值作为参数传递给ProcessRequest方法。
这只是设计模式的结构化实现。 可以根据需要随意更改此实现。 通过利用责任链设计模式,可以促进应用程序的可重用性和松耦合。