责任链模式属于行为型设计模式中的一种。
责任链模式避免将发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理为止。
Handler:传递者接口,定义一个处理请求的接口;实现链中下一个对象(可选)
ConcreteHandler:具体传递者,处理它所负责的请求;可以访问链中下一个对象,如果可以处理请求就处理它,否则将请求传递给下一个对象。
Client:客户端应用程序。
实际生活中的例子:
员工请假,部门经理可以批3天以下的假期,中心总监可批5天以下的假期,副总裁可批10天以下的假期,CEO可以批20天以下假期,超过20天需要开会决定。
示例:
// "Handler"
//传递者抽象类
abstract class Handler
{
protected Handler successor; //维护它的下一个处理对象
public void SetSuccessor(Handler successor)
{
this.successor = successor;
}
//处理方法
public abstract void HandleRequest(int request);
}
具体传递者
// 部门经理
class ConcreteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request <= 3)
{
Console.WriteLine(" {1} 天假期已由部门经理批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
// 中心总监
class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 4 && request < 6)
{
Console.WriteLine(" {1} 天假期已由中心总监批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
//副总裁
class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >=6 && request < 11)
{
Console.WriteLine(" {1} 天假期已由副总裁批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
//CEO
class ConcreteHandler4 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 11 && request < 21)
{
Console.WriteLine(" {1} 天假期已由CEO批示",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
//开会决定
class ConcreteHandler5 : Handler
{
public override void HandleRequest(int request)
{
if (request >= 21)
{
Console.WriteLine(" {1} 天假期需要开会决定",
this.GetType().Name, request);
}
else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
客户端调用
static void Main()
{
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
Handler h4 = new ConcreteHandler4();
Handler h5 = new ConcreteHandler5();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
h3.SetSuccessor(h4);
h4.SetSuccessor(h5);
int[] requests = { 2, 5, 14, 22 };
foreach (int request in requests)
{
h1.HandleRequest(request);
}
Console.Read();
}
执行结果: