酒店项目OO设计
最近公司把网站项目决定全部利用asp.net mvc重构一次,虽然前期没有参与酒店项目重构,但在酒店的数据层以及业务逻辑层都有参与,本人平时喜欢研究些OO知识,在项目中偶尔也在适当的时候用对应的模式来武装代码。
酒店项目最重要的数据处理分为两种:
1:酒店搜索,这里面又详细分为三种:
<1>:酒店列表页搜索
<2>:酒店地图页搜索
<3>:积分广场酒店列表页搜索
说明:以上三种搜索方式,不仅仅是参数不同的问题,在逻辑上都有很大不同。
2:酒店下订单:
<1>:正常酒店订单。
<2>:积分兑换的酒店订单。
目的:为了更好的让页面UI层不涉及业务逻辑,基于抽象工厂理念,来实现解耦,详细的类图如下,并不是我们常见的标准抽象工厂模式,但思路基本一致。
第一:底层的抽象工厂类(管理工厂):HotelAbstractFactory。它主要用来管理酒店搜索工厂以及酒店订单工厂。以下是两个concreteFactory。

{
public virtual ISearchHotel GetSearchHotelInstance(HotelRequestInfo request)
{
return null;
}
public virtual IOrderHotel GetOrderHotelInstance(HotelRequestInfo request)
{
return null;
}
private static HotelAbstractFactory factory = null;
public static HotelAbstractFactory GetInstance(HotelRequestInfo request)
{
switch (request.hotelActionType )
{
case EHotelActionType .Search :
factory = new HotelSearchFactory();
break;
case EHotelActionType.Order :
factory = new HotelOrderFactory ();
break;
}
return factory;
}
}
第二:酒店搜索工厂类:HotelSearchFactory,它会生产出酒店列表页搜索工厂,地图页工厂等,积分广场酒店列表工厂。

{
public override ISearchHotel GetSearchHotelInstance(HotelRequestInfo request)
{
ISearchHotel search = null;
switch (request.hotelType)
{
case EHotelType .ForSimple:
search = new HotelSearchBL();
break;
case EHotelType.ForMap :
search = new HotelSearchForMapBL ();
break;
case EHotelType.ForSquare :
search = new HotelSearchForSquareBL() ;
break;
}
return search;
}
}
第三:酒店订单工厂:HotelOrderFactory,生成正常酒店订单工厂,积分广场订单工厂。

{
public override IOrderHotel GetOrderHotelInstance(HotelRequestInfo request)
{
IOrderHotel order = null;
switch (request.hotelType)
{
case EHotelType.ForSimple:
order = new HotelOrderBL ();
break;
case EHotelType.ForSquare:
order = new HotelOrderForSquareBL ();
break;
}
return order;
}
}
第四:酒店搜索接口:ISearchHotel,所有的搜索工厂都受到它的约束。
{
List<HotelInfo> GetHotelList(HotelRequestInfo request);
}
第五:酒店订单接口:IOrderHotel,所有的酒店产品订单工厂都受它的约束。
{
string InsertHotelOrder(HotelReserveInfo request);
}
第六:酒店搜索接口具体实施类:HotelSearchBL,HotelSearchForMapBL,HotelSearchForSquareBL。

{
public List<HotelInfo> GetHotelList(HotelRequestInfo request)
{
List<HotelInfo> hotelSet = new List<HotelInfo>();
for (int i = 0; i < 10; i++)
{
HotelInfo info = new HotelInfo();
info.hotelID = i;
info.hotelName = "普通酒店" + i.ToString();
hotelSet.Add(info);
}
return hotelSet;
}
}
第七:酒店订单接口具体实施类:HotelOrderBL,HotelOrderForSquareBL。
{
public string InsertHotelOrder(HotelReserveInfo request)
{
return "普通酒店下订单成功";
}
}
客户端调用:
1:调用酒店列表数据:

HotelRequestInfo request=new HotelRequestInfo ();
request .hotelActionType =EHotelActionType .Search ;
request .hotelType =EHotelType .ForSimple ;
List<HotelInfo> list = HotelAbstractFactory.GetInstance(request).GetSearchHotelInstance(request).GetHotelList(request);
2:下普通酒店订单:

request = new HotelRequestInfo();
request.hotelActionType = EHotelActionType.Order;
request.hotelType = EHotelType.ForSimple ;
info = new HotelReserveInfo();
info.hotelID = 1;
result = HotelAbstractFactory.GetInstance(request).GetOrderHotelInstance(request).InsertHotelOrder(info);
优点:
1:多条分支,但方法签名统一,对于搜索来讲,永远只会让用户知道GetHotelList,下订单时,用户也只会知道InsertHotelOrder。
2:UI依赖接口不依赖具体实现,修改其中一条分支的逻辑不会影响其它分支。
3: 通过抽象工厂类,我们可以对酒店项目重要的接口非常清晰。
说明:以上只是我对一个项目的设计思路,图画的不够细,大家请多多指教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2008-04-11 超好玩的js