现在的位置: 首页 > 综合 > 正文

酒店项目OO设计

2012年10月19日 ⁄ 综合 ⁄ 共 4676字 ⁄ 字号 评论关闭

     最近公司把网站项目决定全部利用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: 通过抽象工厂类,我们可以对酒店项目重要的接口非常清晰。

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

 

作者:姜敏
出处:http://www.cnblogs.com/aspnet2008/ 

  

抱歉!评论已关闭.