(转载请注明来源:cnblogs coder-fang)
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订单方法:
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); } }
这种场景比较正常,没有人会预见几年后接口会有哪些变化,而此时接口必须进行变动,则依赖接口的所有项也需要变动,此时会出现接口污染,引出一系列问题,包括集成,测试等。
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); } }
扩展方法是在另一个维度进行发展的,不会修改接口。
扩展方法实现桥接与继承实现桥接有着本质区别,扩展方法不再依赖抽象接口,而是使用在签名上,有着天然的可适应性,能够随意的无限的扩展。
在C#中,优先使用扩展方法来设计有关抽象和实现分离的模式,除了桥接模式,对于其它模式也能带来较大优点。
引用 《.NET 框架模式》