酒店項目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: 通過抽象工廠類,我們可以對酒店項目重要的接口非常清晰。
說明:以上只是我對一個項目的設計思路,圖畫的不夠細,大家請多多指教。