物件導向~如何解除具體依賴

weixin_34119545發表於2011-08-11

解除依賴就是鬆耦合,鬆耦合就一定好嗎?當然不是程式的耦合度與內聚度要放在一起說,當然,對於領域層來說,適當的減少類與類之間的依賴是很有必要的,看下面我的這段程式碼

一個例子,一個訂單系統,它根據國家有不同的下單方法,對於低層(DATA層)是一樣的,但對於領域層,也叫業務邏輯層,它是不一樣的,可能小日本下單打5拍,中國人下單不打折,我也是可以理解的,因為中國石油在對於中國人上是很吝嗇的,而對於小日本則慷慨解囊。不多說了,看程式碼:

    /// <summary>
    /// 訂單實體
    /// </summary>
    class Order
    {
 
    }
 
    #region 傳統作法,無有考慮約束
    /// <summary>
    /// 針對美國人的訂單
    /// </summary>
    class OrderUSA
    {
        public void Insert(Order order) { }
    }
    /// <summary>
    /// 什對日本人的訂單
    /// </summary>
    class OrderJPN
    {
        public void Insert(Order order) { }
    }
    class OrderService
    {
        OrderUSA orderAction1 = new OrderUSA();
        public void Insert(Order order)
        {
            orderAction1.Insert(order);
        }
    }
    #endregion
 
    #region 解除具體依賴後的程式
    /// <summary>
    /// 和訂單操作相關的介面
    /// </summary>
    public interface IOrderAction
    {
        void Insert(Order order);
        void Delete(Order order);
    }
    /// <summary>
    /// 針對中國人的訂單
    /// </summary>
    public class OrderChina : IOrderAction
    {
        public void Insert(Order order)
        {
            throw new NotImplementedException();
        }
        public void Delete(Order order)
        {
            throw new NotImplementedException();
        }
    }
    public class OrderService2
    {
        private IOrderAction iOrderInsert;
        /// <summary>
        /// 根據所傳遞的介面型別的引數來確定使用哪種物件
        /// </summary>
        /// <param name="_iOrderInsert"></param>
        public OrderService2(IOrderAction _iOrderInsert)
        {
            this.iOrderInsert = _iOrderInsert;
        }
        public void InsertOrder(Order order)
        {
            this.iOrderInsert.Insert(order);
        }
        public void DeleteOrder(Order order)
        {
            this.iOrderInsert.Delete(order);
        }
    }
    #endregion

相關文章