1.职责链
namespace DutyChainPattern
{
/// <summary>
/// 职责链模式:就是一个将请求或命令进行转发的流程,类似工作流。
/// 并且,也非常类似状态模式,它们共同的特点就是将一个复杂的判
/// 断逻辑,转移到各个子类,然后在由子类进行简单判断
///
/// 状态模式与职责链模式的区别:
/// 状态模式是让各个状态对象自己知道其下一个处理的对象是谁,即在编译时便设定好了的;
/// 而职责链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定。
/// </summary>
public abstract class RequestTransmit
{
protected RequestTransmit superior;//上级
/// <summary>
/// 用来设置职责链上那个节点来处理请求
/// </summary>
/// <param name="superiorObj"></param>
public void SetSuperior(RequestTransmit superiorObj)
{
superior = superiorObj;
}
/// <summary>
/// 用来处理请求
/// </summary>
/// <param name="request"></param>
public abstract void TransmitRequest(int request);
}
/// <summary>
/// 班主任:职责链上的一个节点,在里面进行判断,看能否处理请求,不能则将请求转移
/// </summary>
public class ClassAdviser : RequestTransmit
{
public override void TransmitRequest(int request)
{
if (request < 2)//假设:小于两天
Console.WriteLine("班主任:你请{0}天假可以通过", request);
else
{
Console.WriteLine("{0}不能处理,将请求发送到上一级",this.ToString());
superior.TransmitRequest(request);//不能处理就将请求转移
}
}
}
/// <summary>
/// 辅导员
/// </summary>
public class Counselor : RequestTransmit
{
public override void TransmitRequest(int request)
{
if (request >= 2 && request <= 5)
Console.WriteLine("辅导员:你请{0}天假可以通过", request);
else
{
Console.WriteLine("{0}不能处理,将请求发送到上一级", this.ToString());
superior.TransmitRequest(request);//不能处理就将请求转移
}
}
}
/// <summary>
/// 辅导员
/// </summary>
public class Secretary : RequestTransmit
{
public override void TransmitRequest(int request)
{
if (request > 5 && request < 10)
Console.WriteLine("书记:你请{0}天假可以通过", request);
else
Console.WriteLine("你退学算了");
}
}
}
2.调用
static void Main(string[] args)
{
RequestTransmit p1 = new ClassAdviser();
RequestTransmit p2 = new Counselor();
RequestTransmit p3 = new Secretary();
/*
* 客户端调用时设置好职责链,此处应该简化,客户端只需发出请求即可,
* 并不需要知道请求处理的流程,就和浏览器原理一样。
* 在此处可以看出,职责链模式和状态模式的最大区别在于处理请求的下
* 一个对象在什么地方设定
*/
p1.SetSuperior(p2);
p2.SetSuperior(p3);
p1.TransmitRequest(1);
Console.ReadKey();
}