• 依赖倒置原则


    A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
    B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

    简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

    面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。
    面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度

    1.在配置文件中配置类名以及相对应的DLL文件名称

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
      <appSettings>
         <add key="ApplePhone" value="DIP.ApplePhone,DIP"/>
        <add key="Honor" value="DIP.Honor,DIP"/>  </appSettings>
    </configuration> 

     2.

    抽象一个基础类:

        public abstract class BasePhone
        {
            public int Id { get; set; }
            public string Branch { get; set; }

            public abstract void System();

            public abstract void Call();
        }

    派生于基础类

        public class ApplePhone : BasePhone
        {
            public override void System()
            {
                Console.WriteLine("IOS9.4");
            }

            public override void Call()
            {
                Console.WriteLine("Use {0} Call", this.GetType().Name);
            }
        }

        public class Honor : BasePhone
        {
            //public int Id { get; set; }
            //public string Branch { get; set; }

            public override void System()
            {
                Console.WriteLine("Android6.0");
            }

            public override void Call()
            {
                Console.WriteLine("Use {0} Call", this.GetType().Name);
            }
        }

        

        public class People
        {
            public int Id { get; set; }
            public string Name { get; set; }


            public void UsePhone(BasePhone phone)
            {
                Console.WriteLine("**********************************************");
                Console.WriteLine("This is {0} 在使用 {1}", this.Name, phone.GetType().Name);
                phone.System();
                phone.Call();
            }
        }

        /// <summary>
        /// 1 细节与抽象:类与接口/抽象类
        /// 2 依赖倒置原则(Dependence Inversion Principle)
        /// 上端和下端之间,应该依赖于抽象,而不依赖于细节
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(" 依赖倒置原则DIP");

                People people = new People()
                {
                    Id = 26,
                    Name = "Andy"
                };

               BasePhone phone = ObjectFactory.CreatePhoneReflection(PhoneType.ApplePhone);

               people.UsePhone(phone);
               Console.Read();
            }
        }

        public class ObjectFactory
        {
            public static BasePhone CreatePhone(PhoneType phoneType)
            {
                BasePhone phone = null;
                switch (phoneType)
                {
                    case PhoneType.ApplePhone:
                        phone = new ApplePhone();
                        break;
                    case PhoneType.Mi:
                        phone = new Mi();
                        break;
                    case PhoneType.Honor:
                        phone = new Honor();
                        break;
                    default:
                        throw new Exception("wrong phoneType");
                }
                return phone;
            }

            //使用反射获取类库中的类名

            public static BasePhone CreatePhoneReflection(PhoneType phoneType)
            {
                string classModule = ConfigurationManager.AppSettings[phoneType.ToString()];
                Assembly assembly = Assembly.Load(classModule.Split(',')[1]);
                Type type = assembly.GetType(classModule.Split(',')[0]);
                object oPhone = Activator.CreateInstance(type);
                return (BasePhone)oPhone;
            }
        }

        public enum PhoneType
        {
            ApplePhone,

            Honor
        }

  • 相关阅读:
    ASP.NET MVC 4使用jQuery传递对象至后台方法
    大沙发斯蒂芬
    2017年年总结
    Java将HTML导出为PDF
    华硕笔记本安装Ubuntu 17.04版本
    全站启用HTTPS配置详解
    设计模式-1 单例模式
    基础知识扫盲--1 抽象类和接口
    ASP.Net 管道模型 VS Asp.Net Core 管道 总结
    索引深入理解
  • 原文地址:https://www.cnblogs.com/zty1294625258/p/5784996.html
Copyright © 2020-2023  润新知