责任链模式:请求从链中的一个对象传递到下一个对象,直到请求被响应为止。通过这种方式在对象之间去除耦合。
用途:请假审批、采购审批等。
案例介绍:以公司采购东西为例子来实现责任链模式。公司规定,采购架构总价在1万之内,经理级别的人批准即可,总价大于1万小于2万5的则还需要副总进行批准,总价大于2万5小于10万的需要还需要总经理批准,而大于总价大于10万的则需要组织一个会议进行讨论
审批类:
/// <summary>
/// 审批实体类
/// </summary>
internal class Approver
{
#region 数据库对应字段
/// <summary>
/// 用户Id
/// </summary>
public string UId { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 下一个审批Id
/// </summary>
public string NextApproverId { get; set; }
/// <summary>
/// 当前最多审批的金额
/// </summary>
public int Amount { get; set; }
#endregion
public Approver NextApprover { get;private set; }
void GetNextApprover()
{
if (!string.IsNullOrWhiteSpace(NextApproverId))
{
// 查找数据库
NextApprover = TestData.GetDataWithUId(NextApproverId);
}
}
public virtual void ProcessRequest(PurchaseRequest request)
{
GetNextApprover();
if (request.Amount <= Amount)
{
Console.WriteLine($"[{Name}] 批准了购买 [{request.ProductName}] 的请求");
}
else
{
if (NextApprover == null)
Console.WriteLine($"需要开会讨论购买 [{request.ProductName}]");
}
if (NextApprover != null)
{
NextApprover.ProcessRequest(request);
}
}
}
采购类:
/// <summary>
/// 采购请求
/// </summary>
internal class PurchaseRequest
{
// 金额
public double Amount { get; set; }
// 产品名字
public string ProductName { get; set; }
public PurchaseRequest(double amount, string productName)
{
Amount = amount;
ProductName = productName;
}
}
测试数据:
internal class TestData
{
static List<Approver> approvers;
static TestData()
{
approvers = new List<Approver>(3);
Approver approver1 = new Approver()
{
UId = Guid.NewGuid().ToString(),
Name = "王总",
Amount = 100000
};
Approver approver2 = new Approver()
{
UId = Guid.NewGuid().ToString(),
Name = "李副总",
NextApproverId = approver1.UId,
Amount = 25000
};
Approver approver3 = new Approver()
{
UId = Guid.NewGuid().ToString(),
Name = "孙经理",
NextApproverId = approver2.UId,
Amount = 10000
};
approvers.Add(approver1);
approvers.Add(approver2);
approvers.Add(approver3);
}
internal static List<Approver> GetDatas()
{
return approvers;
}
internal static List<Approver> GetDatas(Func<Approver, bool> func)
{
return approvers.Where(func).ToList();
}
internal static Approver GetDataWithUId(string uid)
{
return GetData((t) => t.UId == uid);
}
internal static Approver GetData(Func<Approver, bool> func)
{
return approvers.FirstOrDefault(func);
}
}
测试用例:
public static void Test()
{
// 商品类
PurchaseRequest purchase = new PurchaseRequest(20000,"电脑");
PurchaseRequest purchase2 = new PurchaseRequest(2000, "笔");
PurchaseRequest purchase3 = new PurchaseRequest(30000, "手机");
PurchaseRequest purchase4 = new PurchaseRequest(110000, "3台电脑");
// 需要审批的商品
PurchaseRequest NeedPurchase = purchase4;
// 根据金额筛选出权限最低的人
var firstData = TestData.GetDatas().Where(t=>t.Amount>= NeedPurchase.Amount).OrderBy(t => t.Amount).FirstOrDefault();
if (firstData == null)
firstData = TestData.GetDatas().OrderByDescending(t => t.Amount).LastOrDefault();
// 开始审批
firstData.ProcessRequest(NeedPurchase);
}



文章介绍了责任链模式在请求处理中的应用,以公司采购审批为例,展示了如何通过责任链模式将不同级别的审批者(经理、副总、总经理)串联起来,当请求从链中传递,由相应权限的审批者处理。代码示例中,采购请求根据金额大小由不同的审批者批准,超过一定金额则需更高层级审批或召开会议讨论。
854

被折叠的 条评论
为什么被折叠?



