zoukankan      html  css  js  c++  java
  • 酒店项目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: 通过抽象工厂类,我们可以对酒店项目重要的接口非常清晰。

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


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

      
  • 相关阅读:
    Java 9将采用新的版本字符串格式
    Hadoop单机伪分布式
    Hadoop JAVA 开发说明
    Java 批量插入数据(Oracle)
    Myeclipse 的hadoop环境搭建
    [LeetCode] 136. Single Number 单独数
    [LeetCode] 89. Gray Code 格雷码
    [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和
    [LeetCode] 211. Add and Search Word
    [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1709796.html
Copyright © 2011-2022 走看看