(轉載請註明來源: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 框架模式》接口