簡介:
今天我想談談如何使用抽象類,以及抽象類真正的威力。本文將結合具體業務來說明如何使用抽象類,由於本人接觸業務時間不長,如有杠精,請您老再看下標題。
業務簡述:
本人目前只接觸過PMS(物業管理系統),公司主要業務的是美國的租房業務。由於美國租房和中國租房在后台可能有點差別,本文不做敘述。下面我們直入主題。
當用戶點擊租房之后,我們是要創建一個訂單,而在創建訂單的時候,需要做很多事,本文只做一個簡化版的,避免偏離主題。當創建訂單時,需要做以下幾件事:
1.Available 檢查是否可用
2.MinDay 檢查 最小入住天數是否匹配
3.Check in/Check out 檢查入住時間和離開時間是否匹配
4.quote 計算價格。
而針對前三中,只是判斷該房可不可以租。而且有可能以后還會加入其它規則,如果把它們寫在一起也是可以的,但不利於擴展。下面看下我如何使用abstract類來實現他的擴展性:
1.第一步,創建以下類
1.1 創建類 OrderAddDTO.cs
public class OrderAddDTO { /// <summary> /// 物業Id /// </summary> public Guid PropertyId { get; set; } /// <summary> /// 入住時間 /// </summary> public DateTime CheckInDate { get; set; } /// <summary> /// 離開時間 /// </summary> public DateTime CheckOutDate { get; set; } //TODO:其它信息 }
1.2 創建抽象類 PropertyValidAbstract.cs
public abstract class PropertyValidAbstract { protected PropertyValidAbstract _baseValid; public void SetNext(PropertyValidAbstract BaseValid) { this._baseValid = BaseValid; } public static string ErrorMsg { get; set; } public abstract bool IsValid(OrderAddDTO dto); }
1.3 創建Available 驗證類:AvailableValid,並繼承自PropertyValidAbstract
public class AvailableValid : PropertyValidAbstract { public override bool IsValid(OrderAddDTO dto) { //TODO:取出該property(物業)的 Available //if (計算該物業在dto.CheckInDate-dto.CheckOutDate時間內是否可用) //{ //不可用,則對ErrorMsg賦值,並返回false; //TODO:具體實現 //} //如果沒有下一步驗證了,則返回true if (this._baseValid == null) { return true; } //如果可用,則進入下一個驗證 return this._baseValid.IsValid(dto); } }
1.4 創建MinDay 驗證類MinDayValid.cs,並繼承自PropertyValidAbstract
public class MinDayValid : PropertyValidAbstract { public override bool IsValid(OrderAddDTO dto) { //TODO:取出該property(物業)的 MinDay規則 //模擬minday規則,具體的minday比這個復雜多了 var checkDays = (dto.CheckOutDate - dto.CheckInDate).Days + 1; if (checkDays<3) { ErrorMsg = "stay at least 3 days"; return false; } //如果沒有下一步驗證了,則返回true if (this._baseValid == null) { return true; } //如果滿足,則進入下一個驗證 return this._baseValid.IsValid(dto); } }
1.5 創建CheckIn/Out驗證類:CheckInOutDateValid.cs,並繼承自PropertyValidAbstract
public class CheckInOutDateValid : PropertyValidAbstract { public override bool IsValid(OrderAddDTO dto) { //模擬checkin/checkout規則判斷 DayOfWeek checkInWeek = dto.CheckInDate.DayOfWeek; DayOfWeek checkOutWeek = dto.CheckOutDate.DayOfWeek; if (checkOutWeek!= DayOfWeek.Saturday||checkInWeek!= DayOfWeek.Tuesday) { ErrorMsg = "checkin/out Does not meet the"; return false; } //如果沒有下一步驗證了,則返回true if (this._baseValid==null) { return true; } return this._baseValid.IsValid(dto); } }
1.6 最后在創建一個驗證配置類:ValidSettings.cs,並繼承自PropertyValidAbstract
public class ValidSettings: PropertyValidAbstract {public override bool IsValid(OrderAddDTO dto) { //先進行AvailableValid PropertyValidAbstract BaseValid = new AvailableValid(); //在驗證MinDayValid var mindayvalid = new MinDayValid(); BaseValid.SetNext(mindayvalid); //最后是CheckInOutDateValid var checkinOutvalid = new CheckInOutDateValid(); mindayvalid.SetNext(checkinOutvalid); return BaseValid.IsValid(dto); } }
2.在控制台模擬:
static void Main(string[] args) { ///這個dto,是從客戶端傳過來的,在這模擬下 OrderAddDTO dto = new OrderAddDTO(); dto.CheckInDate = DateTime.Now; dto.CheckOutDate = DateTime.Now.AddDays(1); PropertyValidAbstract baseValid = new ValidSettings(); if (baseValid.IsValid(dto)==false) { Console.WriteLine(PropertyValidAbstract.ErrorMsg); } else { //TODO:計算價格
Console.WriteLine("計算價格"); } Console.ReadKey(); }
3.運行結果:
3.1 測試不滿足minday規則
3.2 測試都滿足
運行結果都沒問題,這時候可能客戶來需求,你再給我加個maxday(最大入住天數規則)。這時候我們可以這么做:
1. 新建一個maxday驗證類:MaxDayValid.cs,並繼承自PropertyValidAbstract
public class MaxDayValid : PropertyValidAbstract { public override bool IsValid(OrderAddDTO dto) { //TODO:取出該property(物業)的 MaxDay規則 //模擬maxday規則,具體的maxday比這個復雜多了 var checkDays = (dto.CheckOutDate - dto.CheckInDate).Days + 1; if (checkDays >300) { ErrorMsg = "stay up to 300 days"; return false; } //如果沒有下一步驗證了,則返回true if (this._baseValid == null) { return true; } return this._baseValid.IsValid(dto); } }
2.修改ValidSettings.cs類
public class ValidSettings: PropertyValidAbstract { public override bool IsValid(OrderAddDTO dto) { //先進行AvailableValid PropertyValidAbstract BaseValid = new AvailableValid(); //在驗證MinDayValid var mindayvalid = new MinDayValid(); BaseValid.SetNext(mindayvalid); //新增一個maxday var maxdayvalid = new MaxDayValid(); mindayvalid.SetNext(maxdayvalid); //最后是CheckInOutDateValid var checkinOutvalid = new CheckInOutDateValid(); maxdayvalid.SetNext(checkinOutvalid); return BaseValid.IsValid(dto); } }
3. 我們來看下運行結果:
結束語:
希望我的文章能對你有所幫助,其實以上使用抽象類的例子也是一個設計模式的例子,好像是叫啥責任鏈吧。記得不太清楚。關於設計模式不能死記住,得做到“得其意,忘其形”。謝謝觀看。