简介:
今天我想谈谈如何使用抽象类,以及抽象类真正的威力。本文将结合具体业务来说明如何使用抽象类,由于本人接触业务时间不长,如有杠精,请您老再看下标题。
业务简述:
本人目前只接触过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. 我们来看下运行结果:
结束语:
希望我的文章能对你有所帮助,其实以上使用抽象类的例子也是一个设计模式的例子,好像是叫啥责任链吧。记得不太清楚。关于设计模式不能死记住,得做到“得其意,忘其形”。谢谢观看。
原文地址:https://www.cnblogs.com/norain/p/11441869.html