[设计模式]责任链模式

in Develop

责任链模式属于行为型设计模式中的一种。
责任链模式避免将发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理为止。


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();
}

执行结果:

0 Comments

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>