责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。是对象行为的设计模式。
使用场景:
1、请求中需要涉及多个业务逻辑处理,根据条件选取对应的处理业务类。
2、请求时未知到底又哪些类(一个或多个)进行业务逻辑处理,需要根据条件进行判断才能确定的。
3、在相同的业务使用场景的类中传递,业务存在一定处理的前后顺序。
优点:
1)降低耦合度 :当前对象无需知道请求的最后处理者是哪个对象,对象相对的独立。
2)可简化对象的业务关联 : 对象的顺序关系的建立,对于类无需明确指定,存在下游处理者即可。
3)增强了给对象指派职责的灵活性 :对于执行的顺序和需要哪些对象进行处理,客户端可以根据需要重新组织和指定。
4)增加新的请求处理类很方便。通过共有的抽象类即可
缺点:
1、对于请求者也无法预知当前的是给哪个类进行处理,可能存在未知的业务或者逻辑,请求中的业务可能不在当前定义的职责链中,造成用户请求未处理。
2、会带来一定的性能的消耗,处理过程是通过业务条件判断进行传递,直到找到对应的处理类为止。
抽象评审处理类:
public abstract class IReview
{
public delegate bool ReviewHandle(int request);
public event ReviewHandle ReviewEvent;
public IReview NextReview { get; set; }
public Review review = new Review();
public void ReviewProcess(int day)
{
if (null != ReviewEvent)
{
ReviewEvent(day);
}
}
public abstract bool ReviewRequest(int day);
}
项目组长评审逻辑处理类: public class LeaderReviewBLL : IReview
{
public LeaderReviewBLL()
{
this.ReviewEvent += new ReviewHandle(ReviewRequest);
}
public override bool ReviewRequest(int day)
{
bool isSuccess = true;
if (day <= (int)EnumReviewDay.LeaderReviewDay)
{
review.Resule = true;
review.Reviewer = "Leader";
review.Mark = "Pass";
}
else
{
if(null!=NextReview)
NextReview.ReviewRequest(day);
}
return isSuccess;
}
}
项目经理评审逻辑处理类:
public class ProjectManagerReviewBLL : IReview
{
public ProjectManagerReviewBLL()
{
this.ReviewEvent += new ReviewHandle(ReviewRequest);
}
public override bool ReviewRequest(int day)
{
bool isSuccess = true;
if (day > (int)EnumReviewDay.LeaderReviewDay && day <= (int)EnumReviewDay.DeptManagerDay)
{
review.Resule = true;
review.Reviewer = "ProjectManager";
review.Mark = "Pass";
}
else
{
if (null != NextReview)
NextReview.ReviewRequest(day);
}
return isSuccess;
}
}
部门管理员处理逻辑:
public class DeptManagerReviewBLL : IReview
{
public DeptManagerReviewBLL()
{
this.ReviewEvent += new ReviewHandle(ReviewRequest);
}
public override bool ReviewRequest(int day)
{
bool isSuccess = true;
if (day >= (int)EnumReviewDay.ProjectReviewDay && day < (int)EnumReviewDay.DeptManagerDay)
{
review.Resule = true;
review.Reviewer = "DeptManager";
review.Mark = "Pass";
}
else
{
review.Resule = false;
review.Reviewer = "DeptManager";
review.Mark = "Reject";
}
return isSuccess;
}
}
评审实体:
public class Review
{
public bool Resule { get; set; }
public string Reviewer { get; set; }
public string Mark { get; set; }
}
角色最大评审天数枚举:
public enum EnumReviewDay
{
LeaderReviewDay=1,
ProjectReviewDay=3,
DeptManagerDay=15,
}
客户端调用:
public void Run()
{
LeaderReviewBLL leaderReview = new LeaderReviewBLL();
ProjectManagerReviewBLL projectManager = new ProjectManagerReviewBLL();
DeptManagerReviewBLL deptManager = new DeptManagerReviewBLL();
leaderReview.NextReview = projectManager;
projectManager.NextReview = deptManager;
leaderReview.ReviewProcess(2)
}
</pre><pre>