• 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 框架模式》

  • 相关阅读:
    750. 角矩形的数量(动态规划)
    Python中with标签的使用详解
    GraalVM
    spring 源码解析(二) 2.下载源码,及错误的排除。
    spring 源码解析(一) spring的架构
    词典
    java日志框架 (五)
    java日志框架 (四) 日志相关
    java日志框架 (三) 日志框架使用 之 SLF4J + Log4j2
    java日志框架 (二) 日志框架使用 之 SLF4J + logback
  • 原文地址:https://www.cnblogs.com/coder-fang/p/11236542.html
Copyright © 2020-2023  润新知