職責鏈模式(Chain of Responsibility) 定義 職責鏈模式(Chain of Responsibility),使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 類圖 描述 Handle ...
職責鏈模式(Chain of Responsibility)
定義
職責鏈模式(Chain of Responsibility),使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
類圖
描述
Handler,定義一個處理請求的介面;
ConcreteHandler,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可以處理該請求,就處理;否則就將該請求轉發給它的後繼者。
應用場景
公司規定,員工請假在2天以內(<2天)由部門經理批准,3天以內(<3天)由部門總監批准,超過3天(>=3天)由boss批准。
public abstract class Handler { private string name; /// <summary> /// 管理者的名字 /// </summary> public string Name { get { return name; } } /// <summary> /// 管理者的上級 /// </summary> protected Handler superior; public Handler(string name) { this.name = name; } public void SetSuperior(Handler superior) { this.superior = superior; } public abstract void HandeRequest(Request request); } public class Request { private string name; /// <summary> /// 請假者的姓名 /// </summary> public string Name { get { return name; } set { name = value; } } private double days; /// <summary> /// 請假天數 /// </summary> public double Days { get { return days; } set { days = value; } } } /// <summary> /// 經理 /// </summary> public class Manager : Handler { public Manager(string name) : base(name) { } public override void HandeRequest(Request request) { if (request.Days > 0 && request.Days < 2) { Console.WriteLine(this.Name + "批准了" + request.Name + "的" + request.Days + "天假期."); } else { if (this.superior != null) { this.superior.HandeRequest(request); } } } } /// <summary> /// 總監 /// </summary> public class Majordomo:Handler { public Majordomo(string name) : base(name) { } public override void HandeRequest(Request request) { if (request.Days > 0 && request.Days < 3) { Console.WriteLine(this.Name + "批准了" + request.Name + "的" + request.Days + "天假期."); } else { if (this.superior != null) { this.superior.HandeRequest(request); } } } } public class Boss : Handler { public Boss(string name) : base(name) { } public override void HandeRequest(Request request) { Console.WriteLine(this.Name + "批准了" + request.Name + "的" + request.Days + "天假期."); } }