酒店项目OO设计

酒店项目OO设计

     最近公司把网站项目决定全部利用asp.net mvc重构一次,虽然前期没有参与酒店项目重构,但在酒店的数据层以及业务逻辑层都有参与,本人平时喜欢研究些OO知识,在项目中偶尔也在适当的时候用对应的模式来武装代码。

       酒店项目最重要的数据处理分为两种:

      1:酒店搜索,这里面又详细分为三种:

        <1>:酒店列表页搜索

        <2>:酒店地图页搜索

        <3>:积分广场酒店列表页搜索

        说明:以上三种搜索方式,不仅仅是参数不同的问题,在逻辑上都有很大不同。

      2:酒店下订单:

        <1>:正常酒店订单。

        <2>:积分兑换的酒店订单。

 

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

 

 

 

      第一:底层的抽象工厂类管理工厂):HotelAbstractFactory。它主要用来管理酒店搜索工厂以及酒店订单工厂。以下是两个concreteFactory

 

代码
public   abstract   class  HotelAbstractFactory
    {
        
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   class  HotelSearchFactory:HotelAbstractFactory 
    {
        
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   class  HotelOrderFactory : HotelAbstractFactory
    {
        
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,所有的搜索工厂都受到它的约束。

  public   interface  ISearchHotel
    {
        List
< HotelInfo >  GetHotelList(HotelRequestInfo request);
 
    }

 

      第五:酒店订单接口IOrderHotel,所有的酒店产品订单工厂都受它的约束。

     public   interface  IOrderHotel
    {
        
string  InsertHotelOrder(HotelReserveInfo request);
    }

 

      第六:酒店搜索接口具体实施类HotelSearchBLHotelSearchForMapBLHotelSearchForSquareBL

代码
     public   class  HotelSearchBL : ISearchHotel
    {
        
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;
 
        }
 
    }

 

      第七:酒店订单接口具体实施类HotelOrderBLHotelOrderForSquareBL

     public   class  HotelOrderBL : IOrderHotel
    {
        
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: 通过抽象工厂类,我们可以对酒店项目重要的接口非常清晰。

    说明:以上只是我对一个项目的设计思路,图画的不够细,大家请多多指教。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值