責任鏈模式是一種設計模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。是對象行爲的設計模式。
使用場景:
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>