zoukankan      html  css  js  c++  java
  • 如何使用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. 我们来看下运行结果:

      

    结束语:

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

  • 相关阅读:
    Andorid开发中如何去除标题栏title
    Andorid自动读取短信验证码
    1020. Tree Traversals (25)
    1019. General Palindromic Number (20)
    1003. Emergency (25)
    1014. Waiting in Line (30)
    ubuntu14.04上java jdk & mvn安装
    LVM基本概念及工作原理
    利用Screen重启DevStack服务
    ubuntu14.04 桌面版/服务器版安装DevStack教程
  • 原文地址:https://www.cnblogs.com/norain/p/11441869.html
Copyright © 2011-2022 走看看