* 职责链模式:使多个对象都有机会处理请求,从而避免发送的请求者和处理者的耦合关系。将对象炼成一个条
* 并延这个链处理请求,知道一个对象处理他为止
*
* 图例:
*
* 客户端不需要知道具体哪个处理类处理了这个请求,只要提交就可以,提交请求后请求就会延着职责链
* 一直运行,直到碰到处理他的具体类为止
*
* 也简化了职责链上具体类的关系,各个具体来更关注自己的处理逻辑,只需要指定一个继任的具体类就可以
* 而且可以随时随意的在职责链上添加或者删除新的具体处理类,更灵活
*
* 需要注意的事,一个请求可能到了职责链的末端也没有具体处理类,这可能是因为配置错误,或者业务逻辑错误
* 本文的例子中request=d的条件就没有具体处理类,就会报错(没有指定对应的继任者)
代码:
/// <summary>
/// 抽象处理类
/// </summary>
public abstract class Handler
{
protected Handler successor;//设置继任者
public void SetHandler(Handler successor)//通过这个方法设置继任者,如果自己处理不了就会让继任者去处理
{
this.successor = successor;
}
public abstract void HandleRequest(string request);//处理请求的抽象方法
}
public class HandlerA : Handler
{
public override void HandleRequest(string request)
{
if (request == "a")//如果请求是a,那么就自己处理
{
Console.WriteLine("Handler A deal this ");
}
else//如果这个请求处理不了,就转交给继任者处理,继任者就是通过SetHandler来设置的
{
successor.HandleRequest(request);
}
}
}
public class HandlerB : Handler
{
public override void HandleRequest(string request)
{
if (request == "b")
{
Console.WriteLine("Handler B deal this");
}
else
{
successor.HandleRequest(request);
}
}
}
public class HandlerC :Handler
{
public override void HandleRequest(string request)
{
if (request == "c")
{
Console.WriteLine("Hanler C Deal this");
}
else
{
successor.HandleRequest(request);
}
}
}
客户端调用和组织
Handler ha = new HandlerA();
Handler hb = new HandlerB();
HandlerC hc = new HandlerC();
ha.SetHandler(hb);//设置职责链的上家和下家
hb.SetHandler(hc);//组织好职责链
//ha类的继任者是hb,hb的继任者是hc,hc没有继任者,如果到了hc仍然有未处理的请求那就会报错
string[] test ={ "a","b","c","d"};
foreach(string request in test)
{
ha.HandleRequest(request);
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。