zoukankan      html  css  js  c++  java
  • 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 框架模式》

  • 相关阅读:
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I
    pat 1065 A+B and C (64bit)(20 分)(大数, Java)
    pat 1069 The Black Hole of Numbers(20 分)
    pat 1077 Kuchiguse(20 分) (字典树)
    pat 1084 Broken Keyboard(20 分)
    pat 1092 To Buy or Not to Buy(20 分)
    pat 1046 Shortest Distance(20 分) (线段树)
    pat 1042 Shuffling Machine(20 分)
  • 原文地址:https://www.cnblogs.com/coder-fang/p/11236542.html
Copyright © 2011-2022 走看看