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

  • 相关阅读:
    Windows快捷方式的形式关机方法
    [Andriod官方训练教程]创建你的第一个App之创建一个简单的用户界面
    使用GDAL对HDF数据进行geoloc校正
    破解sqlyog 30天试用限制
    [Andriod官方训练教程]创建你的第一个App之运行你的App
    [Andriod官方训练教程]创建你的第一个App之开始另一个Activity
    GDAL对空间数据的管理
    win linux 下 部署war包到Tomcat根目录
    Spring session
    使用GDAL对HDF数据进行校正
  • 原文地址:https://www.cnblogs.com/coder-fang/p/11236542.html
Copyright © 2011-2022 走看看