设计模式C#实现(十四)——责任链方式
设计模式C#实现(十四)——责任链模式
意图
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性
在以下条件下使用:
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应该被动态指定。
结构
实现
实现一个邮件处理系统,将邮件按照类别交给不同的对象处理。
已经分类的邮件
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();
}
}
运行结果
效果
- 降低耦合度
- 增强了给对象指派职责的灵活性
- 不保证被接受(用一个默认处理类来解决这个问题)
参考
相关推荐
- .NET面试题集锦② 一、前言部分 1.实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。 2.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。 3.请指出GAC的含义? 4.向服务器发送请求有几种方式? 5.DataReader与Dataset有什么区别? 6.软件开发过程一般有几个阶段?每个阶段的作用? 7.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? using 指令 和语句 new 创建实例 new 隐藏基类中方法。 8.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话, 仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个. 9.下面这段代码输出什么,为什么? 10.什么叫做SQL注入,如何防止?请举例说明。 11.什么是反射? 12.用Singleton如何写设计模式? 13.什么是Application Pool? 14.什么是虚函
- 《Java设计模式》之责任链方式
- 《Java设计模式 》之责任链方式
- 设计模式C#实现(十三)——享元方式(蝇量模式)
- 设计模式C#实现(十六)——中介者方式
- 设计模式C#实现(十四)——责任链方式
- GOF23设计模式之责任链方式(chain of responsibility)与结构型模式总结经典
- Java设计模式——Chain of Responsibility(责任链)方式
- javascript实现责任链设计模式 javascript实现责任链设计模式
- GOF23设计模式之责任链方式(chain of responsibility)之实现
- 抽象工厂模式★
- 【设计模式】16.迭代器形式