酒店項目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: 通過抽象工廠類,我們可以對酒店項目重要的接口非常清晰。

    說明:以上只是我對一個項目的設計思路,圖畫的不夠細,大家請多多指教。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章