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

  • 相关阅读:
    CTR预估(3)--正则,交叉验证、特征提取、变量分类
    CTR预估(1)--CTR基础
    svm支持向量机系列(4) --软间隔支持向量机
    机器为什么可以学习(4)---错误和噪声
    svm支持向量机系列(3) -- kernel支持向量机
    svm支持向量机系列(2) -- 对偶支持向量机
    svm支持向量机系列(1) -- 线性支持向量机
    机器为什么可以学习(3)----vc维
    机器为什么可以学习(2)---一般化理论
    GitLab 数据库
  • 原文地址:https://www.cnblogs.com/coder-fang/p/11236542.html
Copyright © 2011-2022 走看看