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

Posted norain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用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. 我们来看下运行结果:

  技术图片

 

 

结束语:

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

 

以上是关于如何使用Abstract类?抽象类的威力的主要内容,如果未能解决你的问题,请参考以下文章

Java抽象类abstract和interface接口

Java抽象

abstract 抽象类

Java中的抽象类abstract

抽象abstract

继承和抽象方法