c#設計模式(橋接)--擴展方法

(轉載請註明來源:cnblogs coder-fang)c#

 

1。建立一個訂單配送的接口,並實現訂單配送,通常作法以下:框架

public interface IDistribute<T>
    {
        void Distribute(T t);
    }
    public class OrderDistribute:IDistribute<Order>
    {
        public void Distribute(Oreder order)
        {
            //配送訂單
        }
    }
    public class DistributeHelper
    {
        IDistribute<Order> distribute = DistributeFactory.Create();
        public void DistributeOrder(Order order)
        {
            distribute.Distribute(order);
        }
    }

 

抽象接口 IDistribute有一個配送方法,OrderDistribute實現了此接口,用來實現具體邏輯,全部應用都依賴抽象部分,即IDistribute。測試

 

2。如今由於需求變動,須要有VIP配送能力,通常方法咱們會在接口中增長VIP訂單方法:this

 public interface IDistribute<T>
    {
        void Distribute(T t);
        void DistributeVIP(T t);
    }
    public class OrderDistribute:IDistribute<Order>
    {
        public void Distribute(Oreder order)
        {
            //配送訂單
        }
        public void DIstributeVIP(Order vipOrder)
        {
            //配送VIP訂單
        }
    }
    public class DistributeHelper
    {
        IDistribute<Order> distribute = DistributeFactory.Create();
        public void DistributeOrder(Order order)
        {
            distribute.Distribute(order);
        }
        public void DistributeVIPOrder(Order ordervip)
        {
            distribute.DistributeVIP(ordervip);
        }
    }

 

這種場景比較正常,沒有人會預見幾年後接口會有哪些變化,而此時接口必須進行變更,則依賴接口的全部項也須要變更,此時會出現接口污染,引出一系列問題,包括集成,測試等。spa

 

3。使用c#的擴展方法讓實現邏輯進行獨立演化:設計

    public interface IDistribute<T>
    {
        void Distribute(T t);//接口不變
    }
    public class OrderDistribute:IDistribute<Order>
    {
        public void Distribute(Oreder order)//最初的實現不變
        {
            //配送訂單
        }        
    }
    public static class DistributeExtends
    {
        public static void DistributeVIP(this IDistribute<Order> distribute,Order vipOrder)
        {
            //配送vip
        }
    }
    public class DistributeHelper
    {
        IDistribute<Order> distribute = DistributeFactory.Create();
        public void DistributeOrder(Order order)
        {
            distribute.Distribute(order);
        }
        public void DistributeVIPOrder(Order ordervip)
        {
            distribute.DistributeVIP(ordervip);
        }
    }

 

擴展方法是在另外一個維度進行發展的,不會修改接口。code

 

擴展方法實現橋接與繼承實現橋接有着本質區別,擴展方法再也不依賴抽象接口,而是使用在簽名上,有着自然的可適應性,可以隨意的無限的擴展。blog

在C#中,優先使用擴展方法來設計有關抽象和實現分離的模式,除了橋接模式,對於其它模式也能帶來較大優勢。繼承

 

引用 《.NET 框架模式》接口

相關文章
相關標籤/搜索