分享

mvc实例:酒店项目OO设计 - .NET/ASP开发者 - web思想社区 关注互联网平...

 通彻之冰 2010-12-25



最近公司把网站项目决定全部利用asp.net mvc重构一次,虽然前期没有参与酒店项目重构,但在酒店的数据层以及业务逻辑层都有参与,本人平时喜欢研究些OO知识,在项目中偶尔也在适当的时候用对应的模式来武装代码
酒店项目最重要的数据处理分为两种:
1:酒店搜索,这里面又详细分为三种:
<1>:酒店列表页搜索
<2>:酒店地图页搜索
<3>:积分广场酒店列表页搜索
说明:以上三种搜索方式,不仅仅是参数不同的问题,在逻辑上都有很大不同。

2:酒店下订单:
<1>:正常酒店订单。
<2>:积分兑换的酒店订单。

目的:为了更好的让页面UI层不涉及业务逻辑,基于抽象工厂理念,来实现解耦,详细的类图如下,并不是我们常见的标准抽象工厂模式,但思路基本一致。

hotelSearchOrder.jpg

第一:底层的抽象工厂类(管理工厂):HotelAbstractFactory。它主要用来管理酒店搜索工厂以及酒店订单工厂。以下是两个concreteFactory。
01.public abstract class HotelAbstractFactory
02.{
03.public virtual ISearchHotel GetSearchHotelInstance(HotelRequestInfo request)
04.{
05.return null;
06.}
07.public virtual IOrderHotel GetOrderHotelInstance(HotelRequestInfo request)
08.
09.return null
10.}
11.private static HotelAbstractFactory factory = null;
12.  
13.public static HotelAbstractFactory GetInstance(HotelRequestInfo request)
14.{
15.switch (request.hotelActionType )
16.{
17.case EHotelActionType .Search :
18.factory = new HotelSearchFactory();
19.break;
20.case EHotelActionType.Order :
21.factory = new HotelOrderFactory ();
22.break;
23.}
24.return factory;
25.}
26.}
第二:酒店搜索工厂类:HotelSearchFactory,它会生产出酒店列表页搜索工厂,地图页工厂等,积分广场酒店列表工厂。
01.public class HotelSearchFactory:HotelAbstractFactory 
02.{
03.public override ISearchHotel GetSearchHotelInstance(HotelRequestInfo request)
04.{
05.ISearchHotel search = null;
06.switch (request.hotelType)
07.{
08.case EHotelType .ForSimple:
09.search = new HotelSearchBL();
10.break;
11.case EHotelType.ForMap :
12.search = new HotelSearchForMapBL ();
13.break;
14.case EHotelType.ForSquare :
15.search = new HotelSearchForSquareBL() ;
16.break;
17.}
18.return search;
19.}
20.}
第三:酒店订单工厂:HotelOrderFactory,生成正常酒店订单工厂,积分广场订单工厂。
01.public class HotelOrderFactory : HotelAbstractFactory
02.{
03.public override IOrderHotel GetOrderHotelInstance(HotelRequestInfo request)
04.{
05.IOrderHotel order = null;
06.switch (request.hotelType)
07.{
08.case EHotelType.ForSimple:
09.order = new HotelOrderBL ();
10.break;
11.  
12.case EHotelType.ForSquare:
13.order = new HotelOrderForSquareBL ();
14.break;
15.}
16.return order;
17.}
18.}
第四:酒店搜索接口:ISearchHotel,所有的搜索工厂都受到它的约束。
1.public interface ISearchHotel
2.{
3.List<HotelInfo> GetHotelList(HotelRequestInfo request);
4.  
5.}
第五:酒店订单接口:IOrderHotel,所有的酒店产品订单工厂都受它的约束。
1.public interface IOrderHotel
2.{
3.string InsertHotelOrder(HotelReserveInfo request);
4.}
第六:酒店搜索接口具体实施类:HotelSearchBL,HotelSearchForMapBL,HotelSearchForSquareBL。
01.public class HotelSearchBL : ISearchHotel
02.{
03.public List<HotelInfo> GetHotelList(HotelRequestInfo request)
04.{
05.List<HotelInfo> hotelSet = new List<HotelInfo>();
06.for (int i = 0; i < 10; i++)
07.{
08.HotelInfo info = new HotelInfo();
09.info.hotelID = i;
10.info.hotelName = "普通酒店" + i.ToString();
11.hotelSet.Add(info);
12.}
13.return hotelSet;
14.  
15.}
16.  
17.}
第七:酒店订单接口具体实施类:HotelOrderBL,HotelOrderForSquareBL。
1.public class HotelOrderBL : IOrderHotel
2.{
3.public string InsertHotelOrder(HotelReserveInfo request)
4.{
5.return "普通酒店下订单成功";
6.  
7.}
8.}
客户端调用:
1:调用酒店列表数据:
1.//搜索普通酒店
2.HotelRequestInfo request=new HotelRequestInfo ();
3.request .hotelActionType =EHotelActionType .Search ;
4.request .hotelType =EHotelType .ForSimple ;
5.List<HotelInfo> list = HotelAbstractFactory.GetInstance(request).GetSearchHotelInstance(request).GetHotelList(request);
2:下普通酒店订单:
1.//普通酒店下订单
2.request = new HotelRequestInfo();
3.request.hotelActionType = EHotelActionType.Order;
4.request.hotelType = EHotelType.ForSimple ;
5.info = new HotelReserveInfo();
6.info.hotelID = 1;
7.result = HotelAbstractFactory.GetInstance(request).GetOrderHotelInstance(request).InsertHotelOrder(info);
优点:
      1:多条分支,但方法签名统一,对于搜索来讲,永远只会让用户知道GetHotelList,下订单时,用户也只会知道InsertHotelOrder。
      2:UI依赖接口不依赖具体实现,修改其中一条分支的逻辑不会影响其它分支。
      3: 通过抽象工厂类,我们可以对酒店项目重要的接口非常清晰。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多