码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-01 12:19:09      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:控制台   bst   匹配   orm   this   而且   今天   order   LIDS   

简介:

  今天我想谈谈如何使用抽象类,以及抽象类真正的威力。本文将结合具体业务来说明如何使用抽象类,由于本人接触业务时间不长,如有杠精,请您老再看下标题。

业务简述:

  本人目前只接触过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. 我们来看下运行结果:

  技术图片

 

 

结束语:

  希望我的文章能对你有所帮助,其实以上使用抽象类的例子也是一个设计模式的例子,好像是叫啥责任链吧。记得不太清楚。关于设计模式不能死记住,得做到“得其意,忘其形”。谢谢观看。

 

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

标签:控制台   bst   匹配   orm   this   而且   今天   order   LIDS   

原文地址:https://www.cnblogs.com/norain/p/11441869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!