c#设计模式(桥接)--扩展方法

(转载请注明来源: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 框架模式》

 

posted @ 2019-07-24 10:48  Coder_fang  阅读(418)  评论(0编辑  收藏  举报