如何使用Abstract類?抽象類的威力


簡介:

  今天我想談談如何使用抽象類,以及抽象類真正的威力。本文將結合具體業務來說明如何使用抽象類,由於本人接觸業務時間不長,如有杠精,請您老再看下標題。

業務簡述:

  本人目前只接觸過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. 我們來看下運行結果:

  

 

 

結束語:

  希望我的文章能對你有所幫助,其實以上使用抽象類的例子也是一個設計模式的例子,好像是叫啥責任鏈吧。記得不太清楚。關於設計模式不能死記住,得做到“得其意,忘其形”。謝謝觀看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM